Форум: "Прочее";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];
ВнизПарсер XML Найти похожие ветки
← →
ggg © (2009-05-24 07:15) [0]Решил все настройки/данные программы хранить в XML, вроде бы просто и удобно. Но не писать же парсер самому, решил воспользоваться готовым и не нашел.
TJclSimpleXML из состава Jedi данные грузит долго, да еще и не правильно. Вместо 73 записей после загрузки у него получилось 146. Грузит по 2 раза одни и те же данные.
После нахождения этой ветки вообще ничего не понял
_http://forum.sources.ru/index.php?showtopic=81572&st=0&#entry610406
Существует только один нормальный парсер от 2002 года, который никем не поддерживается?
Не хочется писать свою оболочку для xmldom, а уж тем более свой парсер. Уверен, что этого добра достаточно.
Подскажите готовый класс.
← →
Palladin © (2009-05-24 08:45) [1]msxml
← →
ggg © (2009-05-24 09:26) [2]А какая-то оболочка для этого msxml предусмотрена? Непрятно как-то работать с интерфейсами - автозавершение кода очень часто не работает, пару методов очень не хватает. Наверняка ведь такое уже написано.
← →
TUser © (2009-05-24 09:33) [3]У меня есть самописный. Хорош тем, что пойдет под линукс, в отличие от msxml.dll. Плох тем, что не совсем корректно воспринимает формат - делал под себя. Например, не знает, что такое комментарии.
unit uXmlParser;
interface
type
PXml = ^TXml;
TXml =
record
Name: shortstring;
Value: string;
Parent: PXml;
Count: integer;
Items: array of PXml;
end;
TXmlFunc = function (Xml: PXml): boolean;
procedure InitXml (var Xml: PXml);
procedure ReadXml (var Xml: PXml; const FileName: string);
procedure PrintXml (Xml: PXml; const FileName: string);
function GetXmlItem (Xml: PXml; const ItemName: string; Silent: boolean = false): PXml; // (Xml, "x1.x2.x3");
procedure EnumXmlItems (Xml: PXml; const ItemName: string; Func: TXmlFunc);
procedure EnumXmlItemsEx (Root: PXml; const Parents, ItemName: string; Func: TXmlFunc); // (Xml, "x1.x2.x3", F);
function GetStr (Xml: PXml; N: shortstring; const Default: shortstring = ""): shortstring;
function GetInt (Xml: PXml; N: shortstring; Default: integer): integer;
function IsEqualXmlItems (Xml1, Xml2: PXml): boolean;
procedure AddItem (Item, NewParent: PXml); overload;
function AddItem (Parent: PXml; const Name, Value: shortstring): PXml; overload;
procedure DelItem (Parent: PXml; Index: integer);
procedure FreeXml (var Xml: PXml);
procedure DelAndFreeItem (Parent: PXml; Index: integer);
implementation
uses Classes, SysUtils;
procedure InitXml (var Xml: PXml);
begin
New (Xml);
with Xml^ do begin
Name := "";
Value := "";
Parent := nil;
Count := 0;
SetLength (Items, 0);
end;
end;
var _Buffer: array of char;
_Length: integer;
procedure AddChar (C: char);
begin
inc (_Length);
if _Length > length (_Buffer) then
SetLength (_Buffer, _Length * 2);
_Buffer[_Length-1] := C;
end;
procedure ReadXml (var Xml: PXml; const FileName: string);
var SL: TStringList;
L, C: integer;
st: integer;
line: string;
cr: PXml;
begin
SL := TStringList.Create;
SL.LoadFromFile (FileName);
cr := nil;
InitXml (cr);
Xml := cr;
st := 0;
_Length := 0;
for L := 0 to Sl.Count - 1 do begin
line := SL[L];
for C := 1 to length (line) do
case st of
0: // initial
if line[C] = "<" then begin
st := 1;
if _Length > 0 then
cr^.Value := trim (cr^.Value + copy (PChar(_Buffer), 1, _Length));
_Length := 0;
end else AddChar (line[C]);
1: // after <
if line[C] = "/" then begin
st := 2;
if cr^.Value <> "" then
if cr^.Value[1] = """ then
if cr^.Value[length(cr^.Value)] = """ then begin
cr^.Value := copy (cr^.Value, 2, length(cr^.Value) - 2);
end;
end else begin
st := 3;
AddChar (line[C]);
end;
2, 3: // after </ or <
if line[C] <> ">" then
AddChar (line[C])
else begin
if st = 2 then
cr := cr^.Parent
else
// if st = 3 then
with cr^ do begin
inc (Count);
if Count > length (Items) then
SetLength (Items, Count + 8);
InitXml (Items[Count-1]);
Items[Count-1].Parent := cr;
cr := Items[Count-1];
cr.Name := copy (PChar(_Buffer), 1, _Length);
end;
st := 0;
_Length := 0;
end;
end; // case
end; // for L := ...
end;
var _Names: array of shortstring;
_NamesCount: integer;
procedure SplitNames (const Names: string);
var i, j: integer;
procedure Add;
begin
if j - i < 2 then exit;
inc (_NamesCount);
if _NamesCount > length (_Names) then
SetLength (_Names, _NamesCount * 2);
_Names[_NamesCount-1] := copy (Names, i + 1, j - i - 1);
i := j;
end;
begin // SplitNames
_NamesCount := 0;
i := 0; j := 1;
while j <= length (Names) do begin
if Names[j] = "." then
Add;
inc (j);
end;
Add;
end;
← →
TUser © (2009-05-24 09:33) [4]
procedure PrintXml (Xml: PXml; const FileName: string);
var f: textfile;
s: shortstring;
function GetVal (const Value: string): string;
var i: integer;
begin
SetLength (result, length (Value));
for i := 1 to length (Value) do
if ord (Value[i]) > 30 then
result[i] := Value[i]
else
result[i] := " ";
if length (result) > 0 then
if (result[1] = " ") or (result[length(result)] = " ") then
result := """ + result + """;
end;
procedure P (X: PXml);
var i: integer;
begin
with X^ do begin
if Count = 0 then
writeln (f, s, "<", Name, ">", GetVal (Value), "</", Name, ">")
else begin
writeln (f, s, "<", Name, ">", GetVal (Value));
s := s + #9;
for i := 0 to Count - 1 do
P (Items[i]);
SetLength (s, length (s) - 1);
writeln (f, s, "</", Name, ">")
end;
end;
end;
var i: integer;
begin // PrintXml;
assignfile (f, FileName);
rewrite (f);
try
s := "";
with Xml^ do
for i := 0 to Count - 1 do
P (Items[i]);
finally
closefile (f);
end;
end;
function GetXmlItem (Xml: PXml; const ItemName: string; Silent: boolean = false): PXml;
var i, j: integer;
f: boolean;
begin
SplitNames (ItemName);
result := Xml;
for i := 0 to _NamesCount - 1 do begin
f := true;
with result^ do
for j := 0 to Count - 1 do
if Items[j].Name = _Names[i] then begin
result := Items[j];
f := false;
break;
end;
if f then begin
if not Silent then
writeln (ItemName, " not found in XML file");
result := nil;
exit;
end;
end;
end;
procedure EnumXmlItems (Xml: PXml; const ItemName: string; Func: TXmlFunc);
var i: integer;
begin
with Xml^ do
for i := 0 to Count - 1 do
if Items[i].Name = ItemName then
if not Func (Items[i]) then
exit;
end;
procedure EnumXmlItemsEx (Root: PXml; const Parents, ItemName: string; Func: TXmlFunc);
begin
EnumXmlItems (GetXmlItem (Root, Parents), ItemName, Func);
end;
function GetStr (Xml: PXml; N: shortstring; const Default: shortstring = ""): shortstring;
begin
Xml := GetXmlItem (Xml, N, true);
if Xml = nil then
result := Default
else
result := Xml.Value;
end;
function GetInt (Xml: PXml; N: shortstring; Default: integer): integer;
var S: string;
begin
S := GetStr (Xml, N);
if S = "" then
result := Default
else result := StrToInt (S);
end;
function IsEqualXmlItems (Xml1, Xml2: PXml): boolean;
var i: integer;
begin
result := (Xml1.Name = Xml2.Name) and
(Xml1.Value = Xml2.Value) and
(Xml1.Count = Xml2.Count);
if result then
for i := 0 to Xml1.Count - 1 do
if not IsEqualXmlItems (Xml1.Items[i], Xml2.Items[i]) then begin
result := false;
exit;
end;
end;
procedure AddItem (Item, NewParent: PXml);
begin
with NewParent^ do begin
inc (Count);
if Count > length (Items) then
SetLength (Items, Count + 8);
Items[Count-1] := Item;
end;
Item.Parent := NewParent;
end;
function AddItem (Parent: PXml; const Name, Value: shortstring): PXml;
begin
result := nil;
InitXml (result);
result.Name := Name;
result.Value := Value;
AddItem (result, Parent);
end;
procedure DelItem (Parent: PXml; Index: integer);
var i: integer;
begin
with Parent^ do begin
for i := Index to Count - 2 do
Items[i] := Items[i+1];
dec (Count);
end;
end;
procedure FreeXml (var Xml: PXml);
var i: integer;
begin
with Xml^ do
for i := 0 to Count - 1 do
FreeXml (Items[i]);
Dispose (Xml);
end;
procedure DelAndFreeItem (Parent: PXml; Index: integer);
begin
FreeXml (Parent.Items[Index]);
DelItem (Parent, Index);
end;
end.
← →
Palladin © (2009-05-24 09:34) [5]Лентяй... но я сегодня добрый. Имплементация для SAX ридера.
Uses
msxml6 ...
Type
_TErrorHandler=Class(TInterfacedObject,IVBSAXErrorHandler)
Private
m_enumLevel:TWRXML2ParseErrorLevelEnum;
m_onError:TWRXML2ParseErrorNotifyEvent;
// IDispatch
Function GetTypeInfoCount(Out Count:Integer):HResult; Stdcall;
Function GetTypeInfo(Index,LocaleID:Integer;Out TypeInfo):HResult; Stdcall;
Function GetIDsOfNames(Const IID:TGUID;Names:Pointer;NameCount,LocaleID:Integer;DispIDs:Pointer):HResult; Stdcall;
Function Invoke(DispID:Integer;Const IID:TGUID;LocaleID:Integer;Flags:Word;Var Params;VarResult,ExcepInfo,ArgErr:Pointer):HResult; Stdcall;
Procedure outerr(Const src:String;const oLocator: IVBSAXLocator; var strErrorMessage: WideString; nErrorCode: Integer);
Procedure error(const oLocator: IVBSAXLocator; var strErrorMessage: WideString; nErrorCode: Integer); safecall;
Procedure fatalError(const oLocator: IVBSAXLocator; var strErrorMessage: WideString; nErrorCode: Integer); safecall;
Procedure ignorableWarning(const oLocator: IVBSAXLocator; var strErrorMessage: WideString;nErrorCode: Integer); safecall;
Public
Constructor Create(p_enumLevel:TWRXML2ParseErrorLevelEnum;p_onError:TWRXML2ParseErrorNotifyE vent);
end;
Constructor _TErrorHandler.Create;Begin m_onError:=p_onError; m_enumLevel:=p_enumLevel;End;
Function _TErrorHandler.GetTypeInfoCount;Begin Result:=E_NOTIMPL;End;
Function _TErrorHandler.GetTypeInfo;Begin Result:=E_NOTIMPL;End;
Function _TErrorHandler.GetIDsOfNames;Begin Result:=E_NOTIMPL;End;
Function _TErrorHandler.Invoke;Begin Result:=E_NOTIMPL;End;
Procedure _TErrorHandler.outerr;
Begin
If @m_onError<>Nil Then m_onError(
"--------------------------------------------------------------------"+CRLF+
"Column:"+_s(oLocator.columnNumber)+CRLF+
"Line:"+_s(oLocator.lineNumber)+CRLF+
"PubID:"+oLocator.publicId+CRLF+
"SysID:"+oLocator.systemId+CRLF+
"ErrorCode:"+_s(nErrorCode)+CRLF+
"Msg:"+strErrorMessage
);
End;
Procedure _TErrorHandler.error;
Begin
If m_enumLevel>=pelError Then
outerr("XML2 parse error",oLocator,strErrorMessage,nErrorCode);
End;
Procedure _TErrorHandler.fatalError;
Begin
If m_enumLevel>=pelFatal Then
outerr("XML2 parse fatal error",oLocator,strErrorMessage,nErrorCode);
End;
Procedure _TErrorHandler.ignorableWarning;
Begin
If m_enumLevel=pelWarnings Then
outerr("XML2 parse warinig",oLocator,strErrorMessage,nErrorCode);
End;
Type
_TFiller=Class(TInterfacedObject,IVBSAXContentHandler)
Private
m_theRoot:IWRXML2Element;
m_theStack:TInterfaceList;
m_aLocator:IVBSAXLocator;
Function LastElement:IWRXML2Element;
// IDispatch
Function GetTypeInfoCount(Out Count:Integer):HResult; Stdcall;
Function GetTypeInfo(Index,LocaleID:Integer;Out TypeInfo):HResult; Stdcall;
Function GetIDsOfNames(Const IID:TGUID;Names:Pointer;NameCount,LocaleID:Integer;DispIDs:Pointer):HResult; Stdcall;
Function Invoke(DispID:Integer;Const IID:TGUID;LocaleID:Integer;Flags:Word;Var Params;VarResult,ExcepInfo,ArgErr:Pointer):HResult; Stdcall;
// IVBASAXContentHandler
Procedure _Set_documentLocator(Const Param1:IVBSAXLocator); Safecall;
Procedure startDocument; Safecall;
Procedure endDocument; Safecall;
Procedure startPrefixMapping(Var strPrefix:WideString;Var strURI:WideString); Safecall;
Procedure endPrefixMapping(Var strPrefix:WideString); Safecall;
Procedure startElement(Var strNamespaceURI,strLocalName,strQName:WideString;Const oAttributes:IVBSAXAttributes); Safecall;
Procedure endElement(Var strNamespaceURI,strLocalName,strQName:WideString); Safecall;
Procedure characters(Var strChars:WideString); Safecall;
Procedure ignorableWhitespace(Var strChars:WideString); Safecall;
Procedure processingInstruction(Var strTarget,strData:WideString); Safecall;
Procedure skippedEntity(Var strName:WideString); Safecall;
Public
Constructor Create;
Destructor Destroy; Override;
Property XML:IWRXML2Element Read m_theRoot Write m_theRoot;
End;
// IDispatch
Function _TFiller.GetTypeInfoCount;Begin Result:=E_NOTIMPL;End;
Function _TFiller.GetTypeInfo;Begin Result:=E_NOTIMPL;End;
Function _TFiller.GetIDsOfNames;Begin Result:=E_NOTIMPL;End;
Function _TFiller.Invoke;Begin Result:=E_NOTIMPL;End;
// IVBASAXContentHandler
Procedure _TFiller._Set_documentLocator;Begin m_aLocator:=Param1;End;
Procedure _TFiller.startDocument;Begin End;
Procedure _TFiller.endDocument;Begin End;
Procedure _TFiller.startPrefixMapping;Begin End;
Procedure _TFiller.endPrefixMapping;Begin End;
Procedure _TFiller.ignorableWhitespace;Begin End;
Procedure _TFiller.processingInstruction;Begin End;
Procedure _TFiller.skippedEntity;Begin End;
Procedure _TFiller.startElement;
Var
i:Integer;
x:IWRXML2Element;
Begin
If m_theStack.Count=0 Then
Begin
x:=TWRXML2Element.Create as IWRXML2Element;
x.SetTagName(strLocalName);
m_theRoot:=x;
End Else x:=LastElement.GetElements.CreateElement(strLocalName);
m_theStack.Add(x);
For i:=0 to oAttributes.length-1 Do
x.GetAttrs.Add(oAttributes.getLocalName(i),oAttributes.getValue(i));
End;
Procedure _TFiller.endElement;
Begin
m_theStack.Delete(m_theStack.Count-1);
End;
Procedure _TFiller.characters;
Var
x:IWRXML2Element;
s:String;
Begin
x:=LastElement;
s:=strChars;
If (x.GetData="") and (s<>#10) and (s<>#32) Then x.SetData(s) Else
If x.GetData="" Then x.SetData(s) Else x.SetData(x.GetData+s);
End;
Function _TFiller.LastElement;
Begin
Result:=IWRXML2Element(m_theStack[m_theStack.Count-1]);
End;
Constructor _TFiller.Create;
Begin
Inherited;
m_theStack:=TInterfaceList.Create;
End;
Destructor _TFiller.Destroy;
Begin
m_theStack.Free;
Inherited;
End;
Class Function TXML2Manager.CreateFromFile(Const p_strFileName:String;p_onParseError:TWRXML2ParseErrorNotifyEvent=Nil;Const p_enumLogErrorLevel:TWRXML2ParseErrorLevelEnum=pelFatal):IWRXML2Elements;
Var
SAX:IVBSAXXMLReader;
CH:_TFiller;
Begin
SAX:=CoSAXXMLReader60.Create;
Result:=TWRXML2Elements.Create as IWRXML2Elements;
Try
CH:=_TFiller.Create;
SAX.contentHandler:=CH as IVBSAXContentHandler;
SAX.errorHandler:=_TErrorHandler.Create(p_enumLogErrorLevel,p_onParseError) as IVBSAXErrorHandler;
SAX.baseURL:="file:///"+p_strFileName;
SAX.parseURL("file:///"+p_strFileName);
Result.Add(CH.XML);
Except
Result:=Nil;
End;
End;
Class Function TXML2Manager.CreateFromSource(Const s:String;p_onParseError:TWRXML2ParseErrorNotifyEvent=Nil;Const p_enumLogErrorLevel:TWRXML2ParseErrorLevelEnum=pelFatal):IWRXML2Elements;
Var
SAX:IVBSAXXMLReader;
CH:_TFiller;
Begin
SAX:=CoSAXXMLReader60.Create;
Result:=TWRXML2Elements.Create as IWRXML2Elements;
Try
CH:=_TFiller.Create;
SAX.contentHandler:=CH as IVBSAXContentHandler;
SAX.errorHandler:=_TErrorHandler.Create(p_enumLogErrorLevel,p_onParseError) as IVBSAXErrorHandler;
SAX.parse(s);
Result.Add(CH.XML);
Except
Result:=Nil;
End;
End;
классы-контейнеры свои выдумывай...
← →
uw © (2009-05-24 09:42) [6]ggg © (24.05.09 07:15)
Подскажите готовый класс.
Есть такой - TXMLDocument.
← →
T&F (2009-05-24 09:55) [7]
> TXMLDocument
Тормознутый
Насчёт парсеров - тоже актуальный вопрос для меня. Хочется услышать мнение об OmniXML. Что за зверь? Кто с ним работал? С чем можно сравнить по скорости? В идеале бы даже неплохо кусочек кода, чтобы оценить основные возможности, но это уже второстепенное
← →
sniknik © (2009-05-24 12:38) [8]> Решил все настройки/данные программы хранить в XML,
это было ошибочное решение...
> вроде бы просто и удобно.
а это заблуждение.
удобно, как же, сравни с ini файлами или реестром.
имхо, использования XML следует избегать! если только нет реальной необходимости, например хранение сложных структур, или вынужденности, например работа с чужими данными идущими в нем/договоренности обмена в нем.
← →
Игорь Шевченко © (2009-05-24 13:06) [9]
> имхо, использования XML следует избегать!
Не следует
← →
Eraser © (2009-05-24 14:21) [10]> [7] T&F (24.05.09 09:55)
>
> > TXMLDocument
>
> Тормознутый
ну-ну
← →
Palladin © (2009-05-24 14:23) [11]
> Eraser © (24.05.09 14:21) [10]
тормозной тормозной :) 2mb 30 сек парсит, негодяй... другое дело SAX )
← →
ggg © (2009-05-24 14:57) [12]>это было ошибочное решение...
Что плохого в стандартизации?
>удобно, как же, сравни с ini файлами или реестром.
ini морально устарел, неудобно хранить древовидные структуры, списки, матрицы.
Реестр - проблемы с передачей данных, да и вообще это большая свалка.
>классы-контейнеры свои выдумывай...
Раз другого варианта нет, ну напишу я этот велосипед.
Т.е. за 11 лет существования XML не было написано ни одного парсера/класса-контейнера, который бы быстро безошибочно читал данные и не вываливался на больших файлах? Смешно.
← →
Palladin © (2009-05-24 15:09) [13]
> Т.е. за 11 лет существования XML не было написано ни одного
> парсера/класса-контейнера
Отчего же, TXMLDocument, наслаждайся, но лично меня не устраивала скорость и удобство работы с ним, контейнер я себе свой разработал. И счАстливо работаю с ним уже больше года. Тебе дать его не могу, ибо тянет за собой кучу других библиотек классов, так же разработанных мной.
← →
Palladin © (2009-05-24 15:12) [14]Они, контейнеры, и вообще, действия при SAX парсинге, вообще то сильно различатся могут, бо зависят от конкретной цели парсинга. TXMLDocument самый универсальный контейнер.
← →
тимохов © (2009-05-24 15:16) [15]Поддерживаю Палладина - XML для хранения настроек нужно использовать, когда нет другой возможности. По моему имху простая структура INI или реестра - есть вполне вменяемый формат хранения для большинства настроек. Дописать хранения списков и матриц - плевое дело.
← →
Eraser © (2009-05-24 15:27) [16]> [11] Palladin © (24.05.09 14:23)
ну тормознутость - понятие относительное. ясное дело, что для спец. задачи можно написать быстрый простой парсер. только вот если нет критических требований к производительности лучше доморощенные спец. средства не использовать по-моему, т.к. пока на каждый чих будешь писать спецальный инструмент - конкуренты 10-ю версию программы уже выпустят, imho.
← →
Palladin © (2009-05-24 15:31) [17]
> Eraser © (24.05.09 15:27) [16]
Я не писал свой парсер, я воспользоватлся SAX парсером. SAX это тоже msxml если что... TXMLDocument это просто уже готовый контейнер от ms. Остальное читай в [13],[14]
> тимохов © (24.05.09 15:16) [15]
Я думаю ты больше согласен с sniknik"ом чем со мной ) Я как раз не против использования XML формата для хранения настроек и опций ), особенно когда один контейнер отвечает за сразу несколько продуктов....
← →
Игорь Шевченко © (2009-05-24 15:34) [18]тимохов © (24.05.09 15:16) [15]
Блин. И ты туда же. Корректность XML может быть проверена стандартными готовыми средствами, в случае ini, реестра, текстовых файлов тебе каждый раз придется писать проверки на корректность данных при изменениях формата, состава и т.п.
ini-файл годится для простых описаний, типа
параметр=значение, да и то, если в написании параметра ошиблись, то ошибку не сразу найдешь :)
и у ini-файла есть один существенный недостаток - стандартные средства записи в него настолько тормозные, что это видно невооруженным глазом.
← →
Леша © (2009-05-24 15:43) [19]TXMLDocument тем хорош, что существует такая штука, как XML Binding. Т.е. рисуешь в отдельном файле свой XML, со всеми предусмотренными структурами и типами. Потом этот файл скармливаешь утилите. И она тебе строит объектную модель.
← →
Eraser © (2009-05-24 15:45) [20]> [17] Palladin © (24.05.09 15:31)
> SAX это тоже msxml если что...
а я все думаю, что за сакс )
ну TXMLDocument хоть и контейнер, но простенький.
← →
Palladin © (2009-05-24 15:52) [21]
> а я все думаю, что за сакс )
не путать с суксем! :)
> ну TXMLDocument хоть и контейнер, но простенький.
да уж... атрибуты и узлы, по сути, абсолютно разные вещи, однако какому то гению в ms пришла в голову определить аттрибут узла в узел )
← →
Кто б сомневался © (2009-05-24 16:12) [22]Имхо в ini и удобнее хранить и он быстрее работает и проще просматривать юзеру. Это не имхо - это очевидный факт. Другое дело дань моде...
← →
Palladin © (2009-05-24 16:18) [23]
> Кто б сомневался © (24.05.09 16:12) [22]
самое страшное, что например, Reget настройки в xml хранит давным давно уже.... и кто заморачивался на "он быстрее работает и проще просматривать юзеру."? а на счет "быстрее работает" я бы еще поспорил...
← →
DVM © (2009-05-24 16:28) [24]пользователям плевать как хранит данные программа, ни в ини не в иксэмэль они глядеть не будут.
← →
Игорь Шевченко © (2009-05-24 17:23) [25]
> пользователям плевать как хранит данные программа, ни в
> ини не в иксэмэль они глядеть не будут.
не надо говорить за всех
← →
sniknik © (2009-05-24 17:29) [26]> Другое дело дань моде...
так и есть, мода и еще бы добавил хороший менеджмент раскрутивший миф о нем как о "удобном и универсальном" (то что он нужен буквально везде это уже отсебятина некоторых особо усердных программистов. имхо.).
кто считает, что мифа нет, объясните одну простую вещь, почему никто из менеджерского отдела про json (аналог xml только не от мелкософта) ни слухом ни духом, а про xml это у них первый вопрос когда программу представляешь, еще до вопроса "что она делает?" спрашивают "а она xml поддерживает?".
вот почему?
← →
ggg © (2009-05-24 17:42) [27]>а про xml это у них первый вопрос когда программу представляешь, еще до вопроса "что она делает?" спрашивают "а она xml поддерживает?"
Заботятся о совместимости?
В общем TXMLDocument прикручиваю. Пусть будет медленно и надежно.
ЗЫ INI vs XML - новый холивар? =\
← →
Игорь Шевченко © (2009-05-24 17:52) [28]sniknik © (24.05.09 17:29) [26]
> миф о нем как о "удобном и универсальном"
Вооьще-то это не миф, действительно удобен и универсален. Другое дело, если кто разок обжегся на бэкапах базы в XML и теперь дует повсюду, где видит XML - ну так это его личные неприятности и к удобству и универсальности xml отношения не имеют.
> почему никто из менеджерского отдела про json (аналог xml
> только не от мелкософта) ни слухом ни духом, а про xml это
> у них первый вопрос
Ну кто ж тебе может растолковать позицию твоего менеджерского отдела ?
← →
Palladin © (2009-05-24 17:52) [29]
> почему никто из менеджерского отдела про json (аналог xml
> только не от мелкософта) ни слухом ни духом
эмнь (с) Розыч
собсна вообще то у них разные предназначения, теплое с мягким ткскть.... json ни разу не аналог xml, а лишь синтаксис текстового определения содержимого [анонимного]объекта в JavaScript.... а что манагеры не знают, так это их минус(проблемы)...
← →
Palladin © (2009-05-24 18:01) [30]
> Вооьще-то это не миф, действительно удобен и универсален.
Ну, лично я, сказал бы что он более универсален чем удобен. Просто кто то, в виде MS, решился внести наконец то какой то порядок в нишу определения структурных данных. Другое дело манагеры (и маркетинговый отдел), которые в силу своей недалекости и недюжей страстью к пропихиванию преподнесли это как очередное лекарство от рака... ну чего с идиотов взять то... главное не вестись
← →
Иа (2009-05-24 18:16) [31]В Delphi (VCL) до сих пор нет стандартного способа хранения настроек?
http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx
← →
sniknik © (2009-05-24 18:19) [32]> если кто разок обжегся на бэкапах базы в XML
а если кто ни разу ни обжегся, и не хочет, но все вокруг постоянно пытаются его обжечь подсовывая этот самый xml вместо того что реально нужно?
> json ни разу не аналог xml
все что можно на xml можно и на json и сложные структуры и деревья, все. т.что по функциональности это полный аналог. по простоте в использовании конечно нет, т.к. очевидно проще.
> а лишь синтаксис текстового определения содержимого [анонимного]объекта в JavaScript.
ну да, а xml это просто синтаксис текстового определения содержимого объекта TXMLDocument.
???
и какая разница? а вот то, что json очень просто преобразовывается в объект JavaScript это очевидное удобство когда работаешь с html и JavaScript (веб интерфейс например к программе прикручиваешь)
← →
Игорь Шевченко © (2009-05-24 18:34) [33]
> Ну, лично я, сказал бы что он более универсален чем удобен.
> Просто кто то, в виде MS, решился внести наконец то какой
> то порядок в нишу определения структурных данных
Вообще-то не MS, вообще-то W3C
"XML был разработан рабочей группой из 11 человек при поддержке около 150 заинтересованных разработчиков. Члены рабочей группы никогда не встречались лицом к лицу — все технические дискуссии происходили в почтовой переписке, а вопросы решались поиском компромисса и, в сложных случаях, голосованием рабочей группы. Основные технические решения были найдены в течение 20 недель интенсивной работы с июля по ноябрь 1996 года, когда был опубликован рабочий черновик спецификации XML. В дальнейшем работа была продолжена, и 10 февраля 1998 года XML обрел статус рекомендованного стандарта."
← →
Игорь Шевченко © (2009-05-24 18:35) [34]sniknik © (24.05.09 18:19) [32]
> а если кто ни разу ни обжегся, и не хочет, но все вокруг
> постоянно пытаются его обжечь подсовывая этот самый xml
> вместо того что реально нужно?
Я к чему - не стоит делать далеко идущие рекомендации из собственной неудачной практики
← →
Palladin © (2009-05-24 18:49) [35]
> Вообще-то не MS, вообще-то W3C
ну да... а жестко пихал то его кто? W3C? и был бы он в забытье...
← →
Игорь Шевченко © (2009-05-24 18:51) [36]Palladin © (24.05.09 18:49) [35]
> ну да... а жестко пихал то его кто?
Не в курсе. Расскажешь ?
Кроме того, я извиняюсь, а в Unix/Linux его тоже MS пихала ? :)
← →
Palladin © (2009-05-24 18:51) [37]
> ну да, а xml это просто синтаксис текстового определения
> содержимого объекта TXMLDocument.
брр... там куда все сложнее чем ты можешь себе представить... как Игорь уже упомянул, один только стандарт для DD XML стоит толпы строчек кода валидации json... которому валидация нафих не нужна по причине не строгости типизации в JS...
← →
Palladin © (2009-05-24 18:55) [38]
> Кроме того, я извиняюсь, а в Unix/Linux его тоже MS пихала
> ? :)
нет, просто "куда все туда и мы"... не вылез бы XML за пределы linux как и остальные толпы linux придумок... бо там подобных велосипедов выше крыши... и как то (типа) случайно MS понравился XML, который не сильно-то по началу признание в nix"ах получил...
кстати, json вылез бы, запросто... только опоздал... потому получил жесткое специализированное поле применения...
← →
Игорь Шевченко © (2009-05-24 18:59) [39]Palladin © (24.05.09 18:55) [38]
Странно, не слышал о проталкивании MS-ом XML. Это исторический факт или предположение ? :)
← →
Palladin © (2009-05-24 19:01) [40]
> Игорь Шевченко © (24.05.09 18:59) [39]
хм ) с твоего позволения я проведу соц. опрос )
← →
тимохов © (2009-05-24 19:10) [41]2ИШ
Семантику все равно не проверишь. А синтаксис проверить - дело плевое.
Возможно, что есть проекты, где буква X в названии XML очень даже оправдывает себя. Я имею в виду проекты, которые предполагают расширение настроек от ключ=значение, до ветвистого дерева с множеством взаимосвязей и пр. Но я таких не знаю. Даже те чужие проекты, которые использую я, не видятся мне кандидатами на XML. Вот возьми Апач - там масса настроект Даже есть куски схожие с XML. Однако синтаксис вполне вменяемый. Та же картина с PHP и MySQL. Согласись, не самые простые проекты, но настройки не в XML.
Ты, Игорь, не подумай, что я против XML. Я сам пользуюсь активно им. Но настройки не вижу смысла в нем хранить.
← →
тимохов © (2009-05-24 19:12) [42]И вообще, коллеги, которые выступают в защиту XML - помогли бы Юрию Зотову http://delphimaster.net/view/15-1243162054/?
Вроде вопрос по теме XML.
← →
Игорь Шевченко © (2009-05-24 19:40) [43]Palladin © (24.05.09 19:01) [40]
> с твоего позволения я проведу соц. опрос )
на линукс-форумах для полноты картины :)
> Семантику все равно не проверишь.
Во-первых, можно и семантику
> А синтаксис проверить - дело плевое.
Во-вторых, зачем делать то, что уже сделано.
> Я имею в виду проекты, которые предполагают расширение настроек
> от ключ=значение, до ветвистого дерева с множеством взаимосвязей
> и пр. Но я таких не знаю.
Delphi например :) Настройки проекта хранятся в XML
> Вот возьми Апач - там масса настроект Даже есть куски схожие
> с XML. Однако синтаксис вполне вменяемый
Не надо брать Apache, он написан до появления XML.
Давай возьмем OpenOffice, который хранит разнообразные конфигурации в XML.
← →
sniknik © (2009-05-24 20:00) [44]> Я к чему - не стоит делать далеко идущие рекомендации из собственной неудачной практики
а разве рекомендация - не использовать там где не оно не нужно, и только там где требуется/не отвертеться. не логична?
и посмотри как его используют, пихают во все щели только потому что круто/модно/удобно(а после вопросы задают, а как с ним вообще работать то? очень удобно)/универсально(и поэтому пихают для трех параметров простенькой программы где код чтения этих параметров занимает больше строк чем код функционала)
← →
Игорь Шевченко © (2009-05-24 20:06) [45]sniknik © (24.05.09 20:00) [44]
> а разве рекомендация - не использовать там где не оно не
> нужно, и только там где требуется/не отвертеться. не логична?
>
Как только ты покажешь все ситуации, где "нужно", а где не "нужно", так будет смысл продолжать дискуссию.
> и посмотри как его используют, пихают во все щели только
> потому что круто/модно/удобно(а после вопросы задают, а
> как с ним вообще работать то? очень удобно)/универсально(и
> поэтому пихают для трех параметров простенькой программы
> где код чтения этих параметров занимает больше строк чем
> код функционала)
Посмотри, как используют TMemo или TListBox для чтения списка строк и их дальнейшей обработки - даже далеко ходить не надо, в "Начинающих" и "Основной" примеров такого использования было, как звезд на небе, да и вопросов никак не меньше, чем по XML. Сделай из этого вывод, что компоненты TMemo и TListBox есть безусловное зло, подлежащее выкорчевыванию из любой программы.
← →
DVM © (2009-05-24 20:30) [46]
> Игорь Шевченко © (24.05.09 17:23) [25]
> не надо говорить за всех
Не один пользователь (именно пользователь) в здравом уме не полезет смотреть настройки программы в скрытую папку c:\Documents and Settings\All Users\Application Data или подобную, чтобы посмотреть содержимое ini или xml файла с настройками программы.
← →
Игорь Шевченко © (2009-05-24 20:31) [47]
> Не один пользователь (именно пользователь) в здравом уме
> не полезет смотреть настройки программы в скрытую папку
> c:\Documents and Settings\All Users\Application Data или
> подобную, чтобы посмотреть содержимое ini или xml файла
> с настройками программы.
Это в линуксе, да ?
← →
DVM © (2009-05-24 20:42) [48]
> Игорь Шевченко © (24.05.09 20:31) [47]
> Это в линуксе, да ?
Для линукса использовать словосочетание "или подобную" из моего поста.
В линуксе XML используется крайне редко пока. Кто настраивал руками сервер с нуля, тот наверняка помнит в каком виде большинство конфигов представлено.
Использовать XML в подобных вещах - это захламлять конфиги и раздувать их размер, одновременно снижая их читабельность для человека.
Читабельность XML ниже, чем того же INI
← →
тимохов © (2009-05-24 21:15) [49]
> Читабельность XML ниже, чем того же INI
Вот. Поддерживаю на все 100.
← →
Медвежонок Пятачок © (2009-05-24 21:43) [50]Вы его глазами что ли читаете?
← →
DVM © (2009-05-24 22:08) [51]
> Медвежонок Пятачок © (24.05.09 21:43) [50]
> Вы его глазами что ли читаете?
Все конфиги в *NIX именно глазами читаются, а пишутся руками.
← →
Медвежонок Пятачок © (2009-05-24 22:16) [52]читал я эти конфиги....
прочитал параметр в сотой строке, и запомнил.
на случай если вдруг в ысячной его похерят.
← →
sniknik © (2009-05-24 22:34) [53]> Сделай из этого вывод, что компоненты TMemo и TListBox есть безусловное зло, подлежащее выкорчевыванию из любой программы.
как только их начнут повсеместно рекламировать как самые "удобные/универсальные" и навязывать во все программы без исключений, причем не по желанию программиста/реальной необходимости их использовать, а из маркетинговых соображений, такой вывод будет сделан, уж будь уверен.
← →
Кто б сомневался © (2009-05-24 22:36) [54]
> DVM © (24.05.09 16:28) [24]
>
> пользователям плевать как хранит данные программа, ни в
> ини не в иксэмэль они глядеть не будут.
И игрушках параметры хранятся в ini. Дык все продвинутые юзеры лезут туда. К примеру все игры на движке Unreal (1 и 2 и 3).
← →
Медвежонок Пятачок © (2009-05-24 22:37) [55]А при чем здесь вообще "читабельность"
Читабельность файла с интерпретируемым кодом выше чем у exe.
И что из этого следует?
Ничего не следует, кроме того, что читабельность у exe никакая.
А кому она нужна?
← →
Игорь Шевченко © (2009-05-24 22:37) [56]sniknik © (24.05.09 22:34) [53]
ты задай себе один вопрос - а зачем их программисты используют таким вот не вполне естественным способом ?
Кроме того, ты забыл написать, где XML нужно использовать, а где не нужно.
← →
DVM © (2009-05-24 22:44) [57]
> Кто б сомневался © (24.05.09 22:36) [54]
> И игрушках параметры хранятся в ini. Дык все продвинутые
> юзеры лезут туда.
Из этого делается вывод - XML - нечитабелен.
> Медвежонок Пятачок © (24.05.09 22:37) [55]
> А при чем здесь вообще "читабельность"
Я и сказал еще в [24], что юзеру по барабану, он читать его все одно не будет.
← →
sniknik © (2009-05-24 23:07) [58]> Кроме того, ты забыл написать, где XML нужно использовать, а где не нужно.
не забыл. просто не было у меня реальной необходимости, т.что не могу разделить где же нужно.
ну вот сложных иерархических настроек программ у меня нет (и не должно, настройки должны быть простыми), таблицы и деревья мне тоже туда нет необходимости пихать. я и так с базами работаю.
придумать что нибудь с потолка? ну это скорее твоя забота показать где без него не обойтись.
← →
Игорь Шевченко © (2009-05-24 23:09) [59]sniknik © (24.05.09 23:07) [58]
Давай в одной какой-нибудь ветке дискутировать, а то неудобно в нескольких одно и то же писать.
← →
KilkennyCat © (2009-05-24 23:15) [60]А я всегда храню настройки в простом текстовом файле... и ничем не заморачиваюсь.
← →
DVM © (2009-05-24 23:16) [61]
> KilkennyCat © (24.05.09 23:15) [60]
Так XML он тоже текстовый.
← →
KilkennyCat © (2009-05-24 23:21) [62]
> DVM © (24.05.09 23:16) [61]
не совсем, похоже. видишь, какие спроы и скока проблем вызывает.
← →
Mystic © (2009-05-25 00:05) [63]Еще можно хранить в DFM-формате. Написать наследника от TPersistent и писать его в поток.
http://mu.webest.net/prog/ClassIO.pas
А с XML у меня только негативные воспоминания. Раза три, помнится, пытался разобраться с настройками форматов Colorer-а в Far-е, они там в XML. Всякий раз от этого ехала крыша. Например, я просто фанател от того, как хранится Regexp-ы в XML, в regexp-e слеш экранируется, в XML слеш тоже экранируется, получается четыре слеша, и получается сверхчитабельное
<regexp match="/(\\) ( [ \{\}\,\:\;\!\\\|\"\]\- ] )/x" region1="texSymb" region2="texWord"/>
<regexp match="/\\\\$/" region0="dError"/>
<regexp match="/^\s*("([^"\\]|(\\\\)|(\\"|n|r)){,254}")\s*=\s*("([^"\\]|(\\\\)|(\\"|n|r))*?")\s* (;.*)?/x"
region1="regString" region5="regString" region9="regComment"/>
.......
<block
start="/(\\) (left) ( [\s\t]* [\,\|\{\}\(\)\[\]] ) | ( [\s\t]+ [\,\|\{\}\(\)\[\]] {0,1} )/x"
end="/ (\\) (right) ( [\s\t]* [\,\|\{\}\(\)\[\]] {0,1} ) /x" scheme="Tex_Formula"
region="texLargeBracket" region00="dpOpenStruct" region10="dpCloseStruct"
region01="texSymb" region02="texLargeBracket" region03="texBrk" region04="texWord"
region11="texSymb" region12="texLargeBracket" region13="texBrk"/>
Специальных тулзовин по XML у меня нету, руками такие конфиги править я зарекся. Хотя честно, раза три пытался пробить себя на "а слабо!". Конечно, кое-кто предпочтет что-то вроде
<function name="Sqr" returns="Real">
<arguments>
<arg name="X" type="Real"/>
</arguments>
<body>
<assigment>
<lvalue>
<variable name="Result"/>
</lvalue>
<rvalue>
<multiplication>
<variable name="X"/>
<variable name="X"/>
</multiplication>
</rvalue>
</assigment>
</body>
</function>
Я лично поищу что-то вроде
function Sqr(X: Real): Real;
begin
Result := X * X;
end;
Как на моем опыте, XML слишком монстрообразный, за тавтологиями не видно сути. Вот, например, предложенный XML для записи шахматной партии.
http://www.cybercom.net/~zbrad/Chess/pgnxml/
Страшно подумать, во что это выльется... Не, формат попроще лучше:
[White "Fedorov, Alexei"]
[Black "Kasparov, Garry"]
[Result "0-1"]
[ECO "B20"]
1. e4 c5 2. d3 Nc6 3. g3 g6 4. Bg2 Bg7 5. f4 d6 6. Nf3 Nf6 7. O-O O-O 8. h3 b5
9. g4 a5 10. f5 b4 11. Qe1 Ba6 12. Qh4 c4 13. Bh6 cxd3 14. cxd3 Bxd3 15. Re1
Bxh6 16. Qxh6 Qb6+ 17. Kh1 Ne5 18. Nbd2 Rac8 19. Ng5 Rc2 20. Rf1 Bxf1 21. Rxf1
Rfc8 22. fxg6 hxg6 23. Nb3 Rxg2 24. Kxg2 Rc2+ 25. Kg3 Qe3+ 0-1
Т. е. получается, что для очень простых форматов XML слишком монстроидальный. Для форматов посложнее получается (языки программирования, шахматная партия, ...) XML серьезно проигрывает в читабельности. При этом каких либо преимуществ не несет.
← →
Медвежонок Пятачок © (2009-05-25 00:13) [64]и снова про читабельность .....
Накой это вообще надо?
Компьютер железный, пусть он читает!
← →
KilkennyCat © (2009-05-25 00:14) [65]
> XML серьезно проигрывает в читабельности. При этом каких
> либо преимуществ не несет.
А если не читать?
Если мы с тобой захотели обменяться данными? Нам не надо договариваться практически ниочем, если и ты и я можем выгрузить-загрузить через XML.
← →
KilkennyCat © (2009-05-25 00:18) [66]Опять же, монстроидальность... тут нельзя винить только XML. Тот, кто с ним работает тоже участвует. Мало вы видели монстроидального в коде любого языка? И что, виноват язык, или тот, кто наворотил хрен чего поймешь?
Вот пример моего описания файла для веб-сайта:<blik speed="8" onpause="8" count="1" pause="20" />
Блик основного логотипа.
speed="8" - скорость движения (количество пикселей, на которые смещается блик за один кадр).
onpause ="8" - пауза перед началом движения.
Примечание: отсчет начинается с момента запуска ролика, независимо от основного логотипа. Это дает возможность, комбинируя параметры блика с параметрами основного логотипа, получить варианты реализации анимации.
count="1" - количество «пробегов» блика.
pause="20" - пауза между «пробегами» блика. Игнорируется, если count = “1”.
<main onspeed="8" page="1"/>
Основная страница (тело) сайта.
onspeed="8" - скорость появления.
page="1" - содержимое (страница), которое появится вместе с основной страницей (телом) сайта:
Что тут нечитабельного и монстроидального?
← →
KilkennyCat © (2009-05-25 00:19) [67]вариант без комментариев:
<?xml version="1.0" encoding="utf-8"?>
<document>
<logo onspeed="8" offspeed="8" pause="20" />
<blik speed="8" onpause="8" count="1" pause="20" />
<main onspeed="8" page="1"/>
<panhud ponspeed ="6" poffspeed="6" pause="3" />
<menu onspeed="6" offspeed="6" fadmax="100" fadmid="60" fadmin="20" ponspeed="3" poffspeed="3" effect="0"/>
...
← →
DVM © (2009-05-25 00:22) [68]
> KilkennyCat © (25.05.09 00:18) [66]
> Что тут нечитабельного и монстроидального?
Ты слишком простой пример привет.
← →
KilkennyCat © (2009-05-25 00:24) [69]
> Ты слишком простой пример привет.
Могу сделать копи пасте сотню раз. Что изменится?
← →
KilkennyCat © (2009-05-25 00:25) [70]я даже больше скажу: чем сложнее ХМL - тем он читабельнее.
← →
KilkennyCat © (2009-05-25 00:33) [71]А удобство совместной работы?
Предположим, то же хранение данных.
Есть некий справочник.
Изначально всех устраивает, но кто-то решил добавить одно, кто-то другое.
Первый обновил общие данные, второй - нет.
Достаточно первому дать свой файл второму и икаких проблем, общие данные будут читаться у всех, а приложения могут отличаться как небо и земля.
← →
DVM © (2009-05-25 00:42) [72]
> KilkennyCat © (25.05.09 00:24) [69]
>
>
> > Ты слишком простой пример привет.
>
> Могу сделать копи пасте сотню раз. Что изменится?
В твоем случае ничего. Вложенность нужна.
> я даже больше скажу: чем сложнее ХМL - тем он читабельнее.
Это спорный вопрос.
← →
Игорь Шевченко © (2009-05-25 00:55) [73]DVM © (25.05.09 00:42) [72]
> В твоем случае ничего. Вложенность нужна.
Изучай :)<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<PersonalityInfo>
<Option>
<Option Name="Personality">Delphi.Personality</Option>
<Option Name="ProjectType"></Option>
<Option Name="Version">1.0</Option>
<Option Name="GUID">{60D8A109-A6DC-4492-A81C-19C886138743}</Option>
</Option>
</PersonalityInfo>
<Delphi.Personality>
<Source>
<Source Name="MainSource">foo.dpr</Source>
</Source>
<FileVersion>
<FileVersion Name="Version">7.0</FileVersion>
</FileVersion>
<Compiler>
<Compiler Name="A">8</Compiler>
<Compiler Name="B">0</Compiler>
<Compiler Name="C">1</Compiler>
<Compiler Name="D">1</Compiler>
<Compiler Name="E">0</Compiler>
<Compiler Name="F">0</Compiler>
<Compiler Name="G">1</Compiler>
<Compiler Name="H">1</Compiler>
<Compiler Name="I">1</Compiler>
<Compiler Name="J">0</Compiler>
<Compiler Name="K">0</Compiler>
<Compiler Name="L">1</Compiler>
<Compiler Name="M">0</Compiler>
<Compiler Name="N">1</Compiler>
<Compiler Name="O">1</Compiler>
<Compiler Name="P">1</Compiler>
<Compiler Name="Q">0</Compiler>
<Compiler Name="R">0</Compiler>
<Compiler Name="S">0</Compiler>
<Compiler Name="T">0</Compiler>
<Compiler Name="U">0</Compiler>
<Compiler Name="V">1</Compiler>
<Compiler Name="W">0</Compiler>
<Compiler Name="X">1</Compiler>
<Compiler Name="Y">1</Compiler>
<Compiler Name="Z">1</Compiler>
<Compiler Name="ShowHints">True</Compiler>
<Compiler Name="ShowWarnings">True</Compiler>
<Compiler Name="UnitAliases">WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;D biErrs=BDE;</Compiler>
<Compiler Name="NamespacePrefix"></Compiler>
<Compiler Name="GenerateDocumentation">False</Compiler>
<Compiler Name="DefaultNamespace"></Compiler>
<Compiler Name="SymbolDeprecated">True</Compiler>
<Compiler Name="SymbolLibrary">True</Compiler>
<Compiler Name="SymbolPlatform">True</Compiler>
<Compiler Name="SymbolExperimental">True</Compiler>
<Compiler Name="UnitLibrary">True</Compiler>
<Compiler Name="UnitPlatform">True</Compiler>
<Compiler Name="UnitDeprecated">True</Compiler>
<Compiler Name="UnitExperimental">True</Compiler>
<Compiler Name="HResultCompat">True</Compiler>
<Compiler Name="HidingMember">True</Compiler>
<Compiler Name="HiddenVirtual">True</Compiler>
<Compiler Name="Garbage">True</Compiler>
<Compiler Name="BoundsError">True</Compiler>
<Compiler Name="ZeroNilCompat">True</Compiler>
<Compiler Name="StringConstTruncated">True</Compiler>
<Compiler Name="ForLoopVarVarPar">True</Compiler>
<Compiler Name="TypedConstVarPar">True</Compiler>
<Compiler Name="AsgToTypedConst">True</Compiler>
<Compiler Name="CaseLabelRange">True</Compiler>
<Compiler Name="ForVariable">True</Compiler>
<Compiler Name="ConstructingAbstract">True</Compiler>
<Compiler Name="ComparisonFalse">True</Compiler>
<Compiler Name="ComparisonTrue">True</Compiler>
<Compiler Name="ComparingSignedUnsigned">True</Compiler>
<Compiler Name="CombiningSignedUnsigned">True</Compiler>
<Compiler Name="UnsupportedConstruct">True</Compiler>
<Compiler Name="FileOpen">True</Compiler>
<Compiler Name="FileOpenUnitSrc">True</Compiler>
<Compiler Name="BadGlobalSymbol">True</Compiler>
<Compiler Name="DuplicateConstructorDestructor">True</Compiler>
<Compiler Name="InvalidDirective">True</Compiler>
<Compiler Name="PackageNoLink">True</Compiler>
<Compiler Name="PackageThreadVar">True</Compiler>
<Compiler Name="ImplicitImport">True</Compiler>
<Compiler Name="HPPEMITIgnored">True</Compiler>
<Compiler Name="NoRetVal">True</Compiler>
<Compiler Name="UseBeforeDef">True</Compiler>
<Compiler Name="ForLoopVarUndef">True</Compiler>
<Compiler Name="UnitNameMismatch">True</Compiler>
<Compiler Name="NoCFGFileFound">True</Compiler>
<Compiler Name="ImplicitVariants">True</Compiler>
<Compiler Name="UnicodeToLocale">True</Compiler>
<Compiler Name="LocaleToUnicode">True</Compiler>
<Compiler Name="ImagebaseMultiple">True</Compiler>
<Compiler Name="SuspiciousTypecast">True</Compiler>
<Compiler Name="PrivatePropAccessor">True</Compiler>
<Compiler Name="UnsafeType">False</Compiler>
<Compiler Name="UnsafeCode">False</Compiler>
<Compiler Name="UnsafeCast">False</Compiler>
<Compiler Name="OptionTruncated">True</Compiler>
<Compiler Name="WideCharReduced">True</Compiler>
<Compiler Name="DuplicatesIgnored">True</Compiler>
<Compiler Name="UnitInitSeq">True</Compiler>
<Compiler Name="LocalPInvoke">True</Compiler>
<Compiler Name="MessageDirective">True</Compiler>
<Compiler Name="CodePage"></Compiler>
</Compiler>
<Linker>
<Linker Name="MapFile">0</Linker>
<Linker Name="OutputObjs">0</Linker>
<Linker Name="GenerateHpps">False</Linker>
<Linker Name="ConsoleApp">1</Linker>
<Linker Name="DebugInfo">False</Linker>
<Linker Name="RemoteSymbols">False</Linker>
<Linker Name="GenerateDRC">False</Linker>
<Linker Name="MinStackSize">16384</Linker>
<Linker Name="MaxStackSize">1048576</Linker>
<Linker Name="ImageBase">4194304</Linker>
<Linker Name="ExeDescription"></Linker>
</Linker>
<Directories>
<Directories Name="OutputDir"></Directories>
<Directories Name="UnitOutputDir"></Directories>
<Directories Name="PackageDLLOutputDir"></Directories>
<Directories Name="PackageDCPOutputDir"></Directories>
<Directories Name="SearchPath"></Directories>
<Directories Name="Packages">vclx;vcl;rtl;dbrtl;vcldb</Directories>
<Directories Name="Conditionals"></Directories>
<Directories Name="DebugSourceDirs"></Directories>
<Directories Name="UsePackages">True</Directories>
</Directories>
<Parameters>
<Parameters Name="RunParams"></Parameters>
<Parameters Name="HostApplication"></Parameters>
<Parameters Name="Launcher"></Parameters>
<Parameters Name="UseLauncher">False</Parameters>
<Parameters Name="DebugCWD"></Parameters>
<Parameters Name="Debug Symbols Search Path"></Parameters>
<Parameters Name="LoadAllSymbols">True</Parameters>
<Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
</Parameters>
<Language>
<Language Name="ActiveLang"></Language>
<Language Name="ProjectLang">$00000000</Language>
<Language Name="RootDir"></Language>
</Language>
</Delphi.Personality>
</BorlandProject>
← →
Mystic © (2009-05-25 00:57) [74]> Что тут нечитабельного и монстроидального?
> я даже больше скажу: чем сложнее ХМL - тем он читабельнее.
Ок, пример посложнее
http://mu.webest.net/prog/01.xml
http://mu.webest.net/prog/02.pgn
> А если не читать?
> Если мы с тобой захотели обменяться данными? Нам не надо
> договариваться практически ниочем, если и ты и я можем выгрузить-
> загрузить через XML.
Итак, ты мне прислал базу шахматных партий в XML. Одна партия в XML заняла 9 Кб, PGN для сравнения занял 1 Кб. База из трех миллионов партий это 3 гигобайта. XML получается 18 Gb. Т. е. мне придется скачать 4 Gb твоего zip-нутого XML (против 1Gb зипнутого PGN), потом мне придется распаковать его (причем искать куда). Далее scid PGN на 3 000 000 000 партий открыл за 10 минут. Сколько будет открываться XML мне даже страшно представить. В любом случае открыть его мне нечем, ибо ни одна из шахматных баз, что у меня стоит на компе, не понимает XML.
Вообще, как ни странно, на моем компе очень мало XML. Из текстовых форматов PGN, SGF, TEX, языки программирования, DFM, субтитры. К XML можно отнести только HTML (но читать его глазами упаси господь) и настройки в Delphi и VS, и еще Colorer.
← →
DVM © (2009-05-25 01:12) [75]
> Игорь Шевченко © (25.05.09 00:55) [73]
Напугать меня хотели? :) Не выйдет.
Если серьезно, вот непонятно мне, зачем в приведенном XML огромное количество раз встречается <Compiler Name="...">...</Compiler>. Это что, читабельности прибавляет? Если что это и прибавляет, так объема более ничего.
Можно было просто написать:
[Compiler]
ZeroNilCompat=True
StringConstTruncated=True
....
и т.д.
И проще и нагляднее. Если с умом подойти, то и вложенность можно не менее наглядно изобразить.
← →
Игорь Шевченко © (2009-05-25 01:13) [76]Mystic © (25.05.09 00:57) [74]
Странный ты. Ну а если база будет не из трех миллионов, а из двадцати трех, тебе все равно придется качать и место искать, неважно, в каком формате.
Я правда не совсем понимаю, нафига 3 миллиона "открывать", но у шахматистов свои тараканы, Паша Хомицкий тоже одно время пытался все и сразу видеть.
← →
Игорь Шевченко © (2009-05-25 01:17) [77]DVM © (25.05.09 01:12) [75]
Тут один момент есть - bdsproj обычно никто, кроме среды, не читает и не пишет. Я достаточно регулярно меняю вручную - при каких-то условиях bdsproj для пакета упорно желает вставлять свою личную VersionInfo, что мне совершенно излишне и приводит к ошибкам компиляции. Это единственный момент, когда я открываю bdsproj, как текст.
Я к чему - не читают его обычно глазами...А EXEшнику гораздо проще знать, файл, который он будет читать, можно стандартно провалидировать, он допускает расширение для будущих версий так, что предыдущие версии не сломаются при чтении, и т.п.
← →
Кто б сомневался © (2009-05-25 01:21) [78]
> > И игрушках параметры хранятся в ini. Дык все продвинутые
>
> > юзеры лезут туда.
>
> Из этого делается вывод - XML - нечитабелен.
Мягко говоря. Очень трудно читать его.
← →
DVM © (2009-05-25 01:22) [79]
> А EXEшнику гораздо проще знать, файл, который он будет читать,
> можно стандартно провалидировать
Вот здесь я согласен.
← →
KilkennyCat © (2009-05-25 01:24) [80]
> огромное количество раз встречается <Compiler Name="...">.
> ..</Compiler>.
<Compiler>
<Compiler Name="A">8</Compiler>
</Compiler>
я бы так создал
<Compiler>
<A value="8"></A>
</Compiler>
Тем самым избежав возможной ошибки закрывающего тэга
← →
Mystic © (2009-05-25 01:29) [81]
> Я правда не совсем понимаю, нафига 3 миллиона "открывать",
> но у шахматистов свои тараканы
"Открытие" условно говоря равно экспорту с свой формат. А открывать надо не все три миллиона партий, а, например, чтобы узнать статистику по позиции. Например, челябинский вариант (обычно возникает после ходов 1. e4 e5 2. Nf3 Nc6 3. d4 cxd4 4. Nxd4 Nf6 5. Nc3 e5 6. Ndb5 d6 7. Bg5 a6 8. Na3 b5, но может получиться и из схевиненгена 1.e4 c5 2.Nf3 e6 3.Nc3 Nc6 4.d4 cxd4 5.Nxd4 Nf6 6.Ndb5 d6 7.Bf4 e5 8.Bg5 a6 9.Na3 b5) встретился по моей базе в 6578-партиях. В этой позиции основные (примерно равноценные) продолжения 9. Bxf6 (3289 партий) и 9.Nd5. Вот статистика:
Move ECO Frequency Score AvElo Perf AvYear %Draws
1: Bxf6 B33s 3289: 50.0% 55.7% 2368 2395 1999 32%
2: Nd5 B33l 3273: 49.7% 52.2% 2331 2348 1998 42%
3: Nab1 12: 0.1% 54.1% 2348 2432 1992 58%
4: [end] B33l 3: 0.0% 50.0% 2001 100%
5: Naxb5 1: 0.0% 50.0% 2005 100%
_______________________________________________________________
TOTAL: 6578:100.0% 54.0% 2350 2372 1998 37%
из которой видно, что Nd5 ведет к более спокойной игре (больше процент ничьих). И что небольшой акцент сместился в сторону Bxf6 (и рейтинг на чуть-чуть выше и средний год).
← →
KilkennyCat © (2009-05-25 01:38) [82]
> Mystic © (25.05.09 01:29) [81]
Прикольно. Обожаю такие анализы. Можно все в студию? Иль сие - коммерческое?
← →
Игорь Шевченко © (2009-05-25 01:41) [83]Mystic © (25.05.09 01:29) [81]
> из которой видно, что Nd5 ведет к более спокойной игре (больше
> процент ничьих). И что небольшой акцент сместился в сторону
> Bxf6 (и рейтинг на чуть-чуть выше и средний год).
Для меня это китайская грамота. Но, насколько мне известно, шахматные программы, разбирающие партию(и) для анализа использу.т механизмы, аналогичные СУБД и мало того, даже и хранят такие разобранные партии в своем внутреннем двоичном формате (а не в тексте и не в XML). Опять же, потому что им так удобнее. Поэтому для партии текстовое представление и XML - это промежуточные звенья, необходимые для создания рюмки коньяка с ломтиком лимона, а следовательно, твой наезд на XML с этой точки зрения ничем не обоснован.
← →
Mystic © (2009-05-25 01:50) [84]Это не анализ, это статистическая обработка на лету. Программа Scid небольшая, в свободном доступе, ее можно скачать. Базу я экспортировал из коммерческой версии Fritz, там около миллиона партий. Если надо больше и свежее, обычно по конкретному варианту, то смотрю в online базе http://www.chesslive.de/ потом экспортирую в PGN, потом открываю в scid. Базы можно поискать на этом форуме http://immortal223.borda.ru/ но там обычно используется формат Chess Base CBV. Он закрытый, приходится конвертировать в PGN, потом экспортировать в Scid.
Если интересно, то из начальной позиции статистика такая:Move ECO Frequency Score AvElo Perf AvYear %Draws
1: e4 B00a 476394: 47.5% 53.2% 2316 2343 1993 32%
2: d4 A40a 338257: 33.7% 55.0% 2363 2392 1992 36%
3: Nf3 A04 88738: 8.8% 55.3% 2378 2403 1993 40%
4: c4 A10 72635: 7.2% 55.1% 2367 2391 1991 37%
5: g3 A00t 8136: 0.8% 55.4% 2373 2391 1993 37%
6: f4 A02 4519: 0.4% 46.9% 2175 2184 1992 27%
7: [end] A00a 3495: 0.3% 54.9% 2311 2359 1991 19%
8: b3 A01 3448: 0.3% 51.6% 2301 2312 1996 31%
9: Nc3 A00l 2088: 0.2% 50.5% 2215 2249 1997 27%
10: b4 A00p 1270: 0.1% 48.1% 2138 2150 1997 25%
11: e3 A00k 605: 0.0% 42.8% 2149 2146 1991 20%
12: d3 A00j 447: 0.0% 48.3% 2241 2221 1995 26%
13: a3 A00f 344: 0.0% 47.6% 2193 2204 1998 24%
14: c3 A00i 199: 0.0% 44.4% 2237 2225 1994 29%
15: g4 A00n 187: 0.0% 46.2% 2260 2197 1997 14%
16: h3 A00d 56: 0.0% 53.5% 2242 2321 1998 21%
17: h4 A00c 41: 0.0% 32.9% 2169 2035 2001 22%
18: Nh3 A00g 21: 0.0% 38.0% 2163 2169 1994 38%
19: f3 A00b 15: 0.0% 26.6% 2143 1907 2001 13%
20: a4 A00e 14: 0.0% 53.5% 1999 21%
21: Na3 A00h 7: 0.0% 78.5% 1997 14%
_______________________________________________________________
TOTAL: 1000916:100.0% 54.1% 2342 2369 1993 35%
← →
KilkennyCat © (2009-05-25 01:51) [85]
> Mystic © (25.05.09 01:50) [84]
спасибо.
← →
Mystic © (2009-05-25 02:02) [86]> Игорь Шевченко © (25.05.09 01:41) [83]
Ну это как я укажу. Во-первых, PGN используется для обмена. Например, сыгран турнир, все партии турнира выкладываются в PGN, я могу их экспортнуль в свою базу. Или, например, базы данных игровых серверов. Во-вторых, я могу PGN просмотреть глазами. Так даже удобнее. Если прошел турнир, я его открываю как текстовый файл и смотрю кто что сыграл. В целом сразу смотрю те варианты, что играю сам и смотрю что там нового произошло. В-третьих небольшие базы я храню непосредственно в PGN. Которые посвящены отдельному варианту, который я использую. Да и просто, избранная база партий французской защитой в PGN занимает 56 Mb. Читается это файл 10 секунд, после чего с ним можно нормально работать. Базы поменьше пополняю руками. Например, если я сыграл интересную партию на сервере, я ее экспортну в PGN (или, еще проще, скопирую PGN в буфер) и вставлю в нужный файлик (файлики). Так быстрее и удобнее. Все эти операции были бы затруднены с XML.
← →
Mystic © (2009-05-25 02:13) [87]Залезая немного вовнутрь, могу попытаться объяснить, за счет чего можно добиться ускорения работы. PGN формат текстовый. В 56 Mb текста содержится 56000 партий. Прочитать 56 Mb надо 10 секунд. Поскольку скорость считывания данных с диска медленна, то можно на лету их обрабатывать, дольше не будет. Для каждой партии я могу отмечать в качестве битовых масок где были пешки и фигуры за всю партию. И в итоге в памяти хранить нечто такое: партия #1, смещение 0, белые пешки были на полях a2, b2, c2, d2, d4, ... партия #2, смещение 1560, ... Таким образом при поиске позиции я вначале проверяю, могла ли возникнуть позиция в партиях по той информации, что я сохранил в кэше. Если могла, я перехожу к партии в файлике и читаю его уже проверяя на каждом ходу.
Насколько я знаю, стандартные XML-парсеры таким образом мне манипулировать не позволят. Они абстрагируют меня от таких ньюансов, как строка/столбец узла, и не позволяют перечитать часть файла...
← →
Игорь Шевченко © (2009-05-25 02:23) [88]Mystic © (25.05.09 02:13) [87]
Я вот одного не понимаю - религия запрещает использовать XML для обмена, переводя его в нужное для анализа представление ?
Впрочем, если запрещает, то бога ради, копаться в чужих тараканах - занятие неблагодарное. В произвольном тексте строк и столбцов тоже нет, твой формат тоже специализированный, весьма вероятно, что для него есть готовые программы чтения и интерпретации, это все нисколько ни умаляет достоинств XML. Один только момент - если я в твой текстовый файл повставляю недопустимых как с точки зрения текста, так и с точки зрения шахмат, сколько времени тебе потребуется, чтобы определить, что он некорректен ?
← →
Mystic © (2009-05-25 02:37) [89]
> Один только момент - если я в твой текстовый файл повставляю
> недопустимых как с точки зрения текста, так и с точки зрения
> шахмат, сколько времени тебе потребуется, чтобы определить,
> что он некорректен ?
На моей машине файл 50 Mb читается 10 секунд, при этом происходит полная проверка: допустимые символы, допустимые ходы. Если под рукой не будет никаких утилит, то писать валидатор придется самому. Но формат очень простой. На XML я могу проверить синтаксис, но вот легкой проверки семантики я не вижу. Как легко определить, является ли ход<move n="34" piece="N" from="b5" to="c3" display="Nc3"/>
допустимым с точки зрения правил шахмат? Есть ли в этот момент на доске конь на поле b5? Свободно ли поле c3? Не открывает ли этот отскок шах королю? Ошибки такого рода достаточно часты в PGN.
Второй вопрос состоит в том, что восстановление после ошибок в текстовом файле проще. По не прочту я три партии из десяти тысяч. Бог с ними. А вот как обстоят дела в этом случае с XML, я честно говоря, не в курсе. Можно ли как-то из поврежденного XML вытащить максимум данных?
← →
Игорь Шевченко © (2009-05-25 02:45) [90]Mystic © (25.05.09 02:37) [89]
> Можно ли как-то из поврежденного XML вытащить максимум данных?
Все зависит от семантики и парсера.
> На XML я могу проверить синтаксис, но вот легкой проверки
> семантики я не вижу. Как легко определить, является ли ход
>
>
> <move n="34" piece="N" from="b5" to="c3" display="Nc3"/>
>
> допустимым с точки зрения правил шахмат?
По меньшей мере можно проверить, что ход
<move n="34" piece="N" from="n5" to="c9" display="Nc3"/>
допустимым не является, не привлекая дополнительных валидаторов.
> Есть ли в этот момент на доске конь на поле b5? Свободно
> ли поле c3?
XML вообще-то декларативный язык, потому выражения "в этот момент" мне не представляются осмысленными именно с этой точки зрения.
← →
T&F (2009-05-25 16:06) [91]Господа, простите, что помешаю дискуссии насчёт "какашка ли XML или не совсем какашка", а также верну обсуждение к сабжу - выбору XML-парсера:
> Насчёт парсеров - тоже актуальный
> вопрос для меня. Хочется услышать мнение об OmniXML. Что
> за зверь? Кто с ним работал? С чем можно сравнить по скорости?
> В идеале бы даже неплохо кусочек кода, чтобы оценить основные
> возможности, но это уже второстепенное
Итак, кто использовал OmniXML? Если никто - признавайтесь :)
И ещё раз - TXMLDocument - класс, супер, лучший вариант для делфи, однако ещё раз повторюсь, что он тормознутый для обработки приличных размеров файлов, а также "педант" - не переваривает малейшие ошибки в структуре XML-документа и тут же заматерится error-ами, хотя сторонние парсеры могут в этом случае продолжить парсинг дальше
Поэтому хочется альтернативу. Судя по ветке, тут все либо используют биндинги, либо свои наработки, которые невозмодно сюда запостить, так как они слишком индивидуальные, либо не используют XML из принципа ))) Вопрос - есть хоть кто-то, кто использует сторонний более-менее известный сторонний парсер? В интернете вообще что-то по этому поводу глухо, какие-то факты и сравнения столетней давности, хочется услышать СВЕЖЕЕ МНЕНИЕ, свежую информацию :) АУ!
PS: взрослые дяди, а насчёт таких вопросов спорите :) XML - естественно не панацея, но и не стоит его сравнивать с реестром или INI-файлами. Выбор способа сохранения данных определяется индивидуально для каждого случая (и для каждого индивидуума, так и хочется добавить), это ж ежу понятно. XML иногда вредит своей избыточностью, например, реестр - не подойдёт для хранения крупных массивов данных (разве что в Windows 7 можно этим заняться: теперь чтение выполняется из файла подкачки и обращения в реестр не требуют размещения данных в таблице памяти), INI - часто заставляют тратить силы на защиту "от дураков" (если программа ориентирована на аудиторию с шаловливыми пальчиками, то пальчики так и стараются что-то там изменить. Залезть в XML решаются лишь самые отважные :) само собой, "дуракозащита" должна быть в каждой программе, хоть XML там юзают, хоть INI, но есть случаи, когда нужно сэкономить на этом драгоценное время, хоть и вопреки качеству).
JSON - вещь хорошая, но это именно альтернатива XML, использовать её для чего-то, кроме веб-программирования (обмен информацией через AJAX), как-то даже неприлично, imho, а уж для Delphi-программ o_O
PPS: ну вот. сам ввязался в спросы и нафлудил. Хотя интересуюсь только ХОРОШИМ ПАРСЕРОМ ;-)
← →
Медвежонок Пятачок © (2009-05-25 16:21) [92]TXMLDocument - для студентов,школьников и их лабораторных.
наш выбор - IXMLDOMDocument.
если данных на гигабайты - sax парсер от того же MS
проверено, шустрее не бывает чтобы использовать что-то другое.
← →
Sergey Masloff (2009-05-25 16:25) [93]T&F (25.05.09 16:06) [91]
>И ещё раз - TXMLDocument - класс, супер, лучший вариант для делфи
TXMLDocument это просто обертка над msxml. Никогда его не использовал. Чем он лучший не знаю.
Сам msxml никаких проблем с производительсностью не имеет (последний раз его производительность смущала в версии 2.6 с тех пор все хорошо). Есть и DOM и SAX. Что еще надо?
Какие размеры документов вызывают проблемы?
← →
Sergey Masloff (2009-05-25 16:27) [94]Медвежонок Пятачок © (25.05.09 16:21) [92]
>если данных на гигабайты - sax парсер от того же MS
+ 1
мегабайт до 100 DOM вполне прилично работает.
Дальше не пробовал - зачем если для SAX размер вообще значения не имеет
← →
sniknik © (2009-05-25 16:38) [95]> JSON - вещь хорошая, но это именно альтернатива XML, ...
> а уж для Delphi-программ o_O
а чего нет то? во всяком случае парсеры самые свежие прямо на родном сайте для всех языков включая дельфи выложены. и есть все возможности xml. + скорость разбора быстрее TXMLDocument. - многие xml-ные заморочки.
не этого ли тебе желалось?
если выбирать "индивидуально для каждого случая" то ничего у тебя такого нет почему бы он не подошел. или это все таки дань моде на поводке у мифов? (тут однозначно, json отдыхает)
← →
T&F (2009-05-25 16:41) [96]
> Sergey Masloff (25.05.09 16:25) [93]
> T&F (25.05.09 16:06) [91] >И ещё раз - TXMLDocument -
> класс, супер, лучший вариант для делфиTXMLDocument это просто
> обертка над msxml. Никогда его не использовал. Чем он лучший
> не знаю.
Я кажется уже запутался. Похоже уже под TXMLDocument подразуеваю и msxml
> тут же заматерится error-ами, хотя сторонние парсеры могут
> в этом случае продолжить парсинг дальше
А как насчёт этого?
← →
Медвежонок Пятачок © (2009-05-25 16:42) [97]а как насчет поддержки этого джейсона на sql серверах?
← →
sniknik © (2009-05-25 16:49) [98]> Какие размеры документов вызывают проблемы?
SAX не пробовал, а DOM где то от 500 мг. попросту виснет (для пробы можно открывать в IE, он его тоже через DOM обрабатывает). а на чтобы составить файлик 2гб, людям знаю, пришлось на сервере с 16гб оперативки неделю обработку выполнять...
сколько бы потребовалось чтобы его открыть не знаю, я сразу отказался это делать (и не потому, что думал, что не смогу или подобное, а потому что знал, нужных мне данных там нет, по определению, зная как и формат его составления. (нужен был простой бэкап базы mssql)).
> а как насчет поддержки этого джейсона на sql серверах?
хреново, нет у него поддержки от MS.
← →
Sergey Masloff (2009-05-25 16:54) [99]>> тут же заматерится error-ами, хотя сторонние парсеры могут
>> в этом случае продолжить парсинг дальше
>А как насчёт этого?
ISAXErrorHandler реализовать например
← →
Sergey Masloff (2009-05-25 16:55) [100]sniknik © (25.05.09 16:49) [98]
>
>сколько бы потребовалось чтобы его открыть не знаю, я сразу отказался >это делать (и не потому, что думал, что не смогу или подобное, а потому >что знал, нужных мне данных там нет, по определению, зная как и формат >его составления. (нужен был простой бэкап базы mssql)).
Да ты описывал тот случай. Для той задачи это конечно была бредовая идея заказчиков ;-)
← →
T&F (2009-05-25 17:03) [101]
> ISAXErrorHandler реализовать например
Хм.
http://rsdn.ru/forum/xml/292647.flat.aspx
Это видно тоже не панацея
← →
Игорь Шевченко © (2009-05-25 17:04) [102]sniknik © (25.05.09 16:49) [98]
Можно конечно и видео в XML передавать, дурное дело нехитрое. Только вот беда какая - сам XML тут не причем, как не причем TMemo, применяемое для чтения текстового файла и последующей обработки строк, компрене ву ?
← →
sniknik © (2009-05-25 17:05) [103]> Для той задачи это конечно была бредовая идея заказчиков ;-)
если бы заказчиков, это наш "гениальный" менеджер договорился, настоял прямо таки, и заказчиков напряг, и нас подставил (я бы с их стороны точно подумал что имею дело с идиотами).
← →
sniknik © (2009-05-25 17:08) [104]> сам XML тут не причем
я не говорил что он при чем, причем то что его навязывают, причем люди в этом совершенно не соображающие, на поводу у менеджмента.
← →
makvell (2009-05-25 17:16) [105]а какой топик был... :)
← →
Sergey Masloff (2009-05-25 17:23) [106]T&F (25.05.09 17:03) [101]
>http://rsdn.ru/forum/xml/292647.flat.aspx
Вы всегда форумы вместо документации читаете? Плохая привычка.
Чтобы обрабатывать результат возвращаемый методами ISAXErrorHandler вообще-то нужно свойства ридера настроить.
Естественно если это FatalError парсинг остановится в любом случае. Для просто error останавливается ПО УМОЛЧАНИЮ также вне зависимости от возвращаемого результата. Это можно изменить.
← →
Sergey Masloff (2009-05-25 17:28) [107]Игорь Шевченко © (25.05.09 17:04) [102]
>Можно конечно и видео в XML передавать, дурное дело нехитрое.
А почему дурное? Иногда и видео передают. Если это видео привязано к другим данным иногда довольно удобно в одном флаконе иметь. Я делал интерфейс к одной системе в которой хранятся результаты испытаний. Они как раз отдают все одним xml файлом - там условия проведения, видеосъемка опыта и фото результатов. А дальше обрабатывай как хочешь. Не скажу что однозначно лучшее решение но вобщем-то и не самое плохое.
← →
Игорь Шевченко © (2009-05-25 17:45) [108]Sergey Masloff (25.05.09 17:28) [107]
ну, кто-то может считать и передачу бэкапа базы не самым плохим решением, особенно, если этот бэкап к чему-то привязан :)
← →
T&F (2009-05-25 18:10) [109]
> Вы всегда форумы вместо документации читаете? Плохая привычка.
Нет, форумы - для быстрой оценки возможных проблем, почитать отзывы и всё такое прочее
Вообще-то вообще не хотел кидать ссылку эту, самому показалась проблема слишком искуственной.
← →
atruhin © (2009-05-25 18:41) [110]> [104] sniknik © (25.05.09 17:08)
В качестве примера, экспорт/импорт данных в 1С, пробовал варианты: OLE, dbf, XML.
Ole - просто, но очень медленно.
dbf - приходится создавать кучу таблиц под разные справочники, деревья.
xml - скорость на 10-20 тыс. записей сопоставима с dbf, но проще и удобней,
ничего не нужно придумывать, структура древовидного справочника, мастер/деталь
переносится 1-1.
У меня в программе в XML храняться все настройки интерфейса, меню/тулбары/позиции и настройки окон,
с трудом представляю более удобный формат хранения.
← →
blackman © (2009-05-25 22:04) [111]xml - скорость на 10-20 тыс. записей сопоставима с dbf, но проще и удобней
А чем проще? Отнюдь не проще, особенно при последующем его использовании и скорость будет не сопоставима
← →
atruhin © (2009-05-25 22:38) [112]> [111] blackman © (25.05.09 22:04)
> А чем проще? Отнюдь не проще
Проще тем, что например, нужно выгрузить документы и связанные с ними 2-5 справочников.
Придется создавать под каждого справочника таблицу, для документов по несколько таблиц.
Все это делать в динамике. Т.к справочники древовидные, то нужно выгружать дерево
например ID <-> PARENT_ID.
Соответственно при загрузке, необходимо грузить дерево от корня, и если для SQL я могу получить
упорядоченное дерево 1 запросом, то тут ручками.
А в XML дерево выгружается/загружается "нативно".
В общем все это пробовали, для XML кода в 2-3 раза меньше.
> Отнюдь не проще, особенно при последующем его использовании
> и скорость будет не сопоставима
А чего ей сильно отличаться? Скорость выгрузки одинаковая, что dbf, что xml по сути текстовые файлы.
Скорость загрузки зависит от того как разбирать деревья в dbf, но на глаз примерно как и XML.
Ну и размер файла выгрузки у XML меньше. Несмотря на теги.
← →
SPeller © (2009-05-26 05:41) [113]А я заюзал libxml. Написал пару классов-оберток и живу не тужу :)
← →
iZEN © (2009-05-28 01:31) [114]Хранить конфиги в XML — МОВЕТОН.
Иерархические структуры записей лучше хранить в виде:кагория.подкатегория.параметр="значение"
Никакого парсера не нужно — достаточно лишь вызвать properties-ридер и загнать значения в хэш-таблицу.
← →
DVM © (2009-05-28 01:43) [115]
> кагория.подкатегория.параметр="значение"
+1
Такое мне нравится.
← →
SPeller © (2009-05-28 01:51) [116]Все зависит от ситуации. Нет идеальных решений )
← →
Игорь Шевченко © (2009-05-28 02:17) [117]
> Иерархические структуры записей лучше хранить в виде:
> кагория.подкатегория.параметр="значение"
неудобно
← →
SPeller © (2009-05-28 08:20) [118]Структура DFM, кстати, напоминает XML :)
← →
DVM © (2009-05-28 10:45) [119]
> SPeller © (28.05.09 08:20) [118]
Не. Весьма отдаленно. Ini напоминает еще больше.
← →
Mystic © (2009-05-28 11:26) [120]
> Иерархические структуры записей лучше хранить в виде:
Я еще видел вариант, когда иерархия записывается примерно так:
[Delphi/Compiler]
APPTYPE=CONSOLE
IMAGEBASE=$04000000
[Delphi/Directories]
SearchPath=...
← →
iZEN © (2009-05-29 21:14) [121]
> > Иерархические структуры записей лучше хранить в виде:
> > кагория.подкатегория.параметр="значение"
>
>
> неудобно
Чем?
← →
Игорь Шевченко © (2009-05-29 21:54) [122]iZEN © (29.05.09 21:14) [121]
Глаза путаются.
Даже ini-файл удобней, чем предложенный тобой формат. А если читать/писать не вручную, то я не понимаю, чем плох XML. К тому же, XML умеет самовалироваться, а твой формат - не знаю.
← →
iZEN (2009-06-04 23:49) [123]
> Игорь Шевченко © (29.05.09 21:54) [122]
>
> iZEN © (29.05.09 21:14) [121]
>
> Глаза путаются.
>
> Даже ini-файл удобней, чем предложенный тобой формат. А
> если читать/писать не вручную, то я не понимаю, чем плох
> XML. К тому же, XML умеет самовалироваться, а твой формат
> - не знаю.
Ну не знаю.
Схема, которую я предложил, используется в протоколах обмена SMNP (управление сетевым оборудованием).
http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_OneIn telecommunications and computer networking, Abstract Syntax Notation One (ASN.1) is a standard and flexible notation that describes data structures for representing, encoding, transmitting, and decoding data. It provides a set of formal rules for describing the structure of objects that are independent of machine-specific encoding techniques and is a precise, formal notation that removes ambiguities.
ASN.1 is a joint ISO/IEC and ITU-T standard, originally defined in 1984 as part of CCITT X.409:1984. ASN.1 moved to its own standard, X.208, in 1988 due to wide applicability. The substantially revised 1995 version is covered by the X.680 series. The latest available version is dated 2002, and is backward compatible with the 1995 version.
http://ru.wikipedia.org/wiki/ASN.1ASN.1 (англ. Abstract Syntax Notation One) — в области телекоммуникаций и компьютерных сетей язык для описания абстрактного синтаксиса данных (ASN.1), используемый OSI. Стандарт записи, описывающий структуры данных для представления, кодирования, передачи и декодирования данных. Он обеспечивает набор формальных правил для описания структуры объектов, которые не зависят от конкретной машины. ASN.1 является ISO и ITU-T совместимым стандартом, первоначально был определён в 1984 году в рамках CCITT X.409:1984. Из-за широкого применения ASN.1 в 1988 году перешёл в свой собственный стандарт X.208. Начиная с 1995 года, существенно пересмотренный ASN.1 описывается стандартом X.680.
В России ASN.1 стандартизирован по ГОСТ Р ИСО/МЭК 8824-1-2001 и ГОСТ Р ИСО/МЭК 8825-93
sysctl в Unix имеет тот же формат представления параметров.
← →
Игорь Шевченко © (2009-06-05 00:27) [124]iZEN (04.06.09 23:49) [123]
> Схема, которую я предложил, используется в протоколах обмена
> SMNP (управление сетевым оборудованием).
XML вообще тоже много где используется. А RFC-822 так и повсеместно (тоже, кстати, формат) :)
Но насколько я тебя понял, речь шла о ручной записи ? :)
← →
iZEN © (2009-06-06 17:12) [125]
> Игорь Шевченко © (05.06.09 00:27) [124]
>
> Но насколько я тебя понял, речь шла о ручной записи ? :)
Любой property-editor в помощь — набить два поля не велика задача, в отличие от XML. :)
← →
TUser © (2009-06-07 22:38) [126]Раз уж кинул сюда [3], то должен сказать, что там мемлик :(
Страницы: 1 2 3 4 вся ветка
Форум: "Прочее";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];
Память: 0.94 MB
Время: 0.013 c