Главная страница
    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]

хм ) с твоего позволения я проведу соц. опрос )



Страницы: 1 2 3 4 вся ветка

Форум: "Прочее";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.03 c
8-1196165704
DmT
2007-11-27 15:15
2009.08.09
ПОЛУпрозрачность в некоторой области формы


2-1245012972
HRustBB
2009-06-15 00:56
2009.08.09
Сохранить текстовый файл в UTF-8


1-1211807607
Jungle
2008-05-26 17:13
2009.08.09
"Правильно" преобразовать тип Variant


15-1243715424
Юрий
2009-05-31 00:30
2009.08.09
С днем рождения ! 31 мая 2009 воскресенье


15-1244542530
Машинка
2009-06-09 14:15
2009.08.09
Блок питания 16-10v





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский