Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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&amp;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&amp;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&amp;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&amp;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&amp;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_One
In 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.1
ASN.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
15-1244237635
Галинка
2009-06-06 01:33
2009.08.09
серверы для командных онлайн-игр


2-1244658173
aha
2009-06-10 22:22
2009.08.09
Интересует есть ли готовые компоненты , позволяющие получать


2-1245065404
kunka
2009-06-15 15:30
2009.08.09
перехват ctrl+v


2-1245002203
Mimi
2009-06-14 21:56
2009.08.09
Создание "Справки" и "О программе"


6-1205160643
alexm_hs
2008-03-10 17:50
2009.08.09
Как работать с MIB-файлами?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский