Форум: "Прочее";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];
ВнизПарсер XML Найти похожие ветки
← →
ggg © (2009-05-24 07:15) [0]Решил все настройки/данные программы хранить в XML, вроде бы просто и удобно. Но не писать же парсер самому, решил воспользоваться готовым и не нашел.
TJclSimpleXML из состава Jedi данные грузит долго, да еще и не правильно. Вместо 73 записей после загрузки у него получилось 146. Грузит по 2 раза одни и те же данные.
После нахождения этой ветки вообще ничего не понял
_http://forum.sources.ru/index.php?showtopic=81572&st=0&#entry610406
Существует только один нормальный парсер от 2002 года, который никем не поддерживается?
Не хочется писать свою оболочку для xmldom, а уж тем более свой парсер. Уверен, что этого добра достаточно.
Подскажите готовый класс.
← →
Palladin © (2009-05-24 08:45) [1]msxml
← →
ggg © (2009-05-24 09:26) [2]А какая-то оболочка для этого msxml предусмотрена? Непрятно как-то работать с интерфейсами - автозавершение кода очень часто не работает, пару методов очень не хватает. Наверняка ведь такое уже написано.
← →
TUser © (2009-05-24 09:33) [3]У меня есть самописный. Хорош тем, что пойдет под линукс, в отличие от msxml.dll. Плох тем, что не совсем корректно воспринимает формат - делал под себя. Например, не знает, что такое комментарии.
unit uXmlParser;
interface
type
PXml = ^TXml;
TXml =
record
Name: shortstring;
Value: string;
Parent: PXml;
Count: integer;
Items: array of PXml;
end;
TXmlFunc = function (Xml: PXml): boolean;
procedure InitXml (var Xml: PXml);
procedure ReadXml (var Xml: PXml; const FileName: string);
procedure PrintXml (Xml: PXml; const FileName: string);
function GetXmlItem (Xml: PXml; const ItemName: string; Silent: boolean = false): PXml; // (Xml, "x1.x2.x3");
procedure EnumXmlItems (Xml: PXml; const ItemName: string; Func: TXmlFunc);
procedure EnumXmlItemsEx (Root: PXml; const Parents, ItemName: string; Func: TXmlFunc); // (Xml, "x1.x2.x3", F);
function GetStr (Xml: PXml; N: shortstring; const Default: shortstring = ""): shortstring;
function GetInt (Xml: PXml; N: shortstring; Default: integer): integer;
function IsEqualXmlItems (Xml1, Xml2: PXml): boolean;
procedure AddItem (Item, NewParent: PXml); overload;
function AddItem (Parent: PXml; const Name, Value: shortstring): PXml; overload;
procedure DelItem (Parent: PXml; Index: integer);
procedure FreeXml (var Xml: PXml);
procedure DelAndFreeItem (Parent: PXml; Index: integer);
implementation
uses Classes, SysUtils;
procedure InitXml (var Xml: PXml);
begin
New (Xml);
with Xml^ do begin
Name := "";
Value := "";
Parent := nil;
Count := 0;
SetLength (Items, 0);
end;
end;
var _Buffer: array of char;
_Length: integer;
procedure AddChar (C: char);
begin
inc (_Length);
if _Length > length (_Buffer) then
SetLength (_Buffer, _Length * 2);
_Buffer[_Length-1] := C;
end;
procedure ReadXml (var Xml: PXml; const FileName: string);
var SL: TStringList;
L, C: integer;
st: integer;
line: string;
cr: PXml;
begin
SL := TStringList.Create;
SL.LoadFromFile (FileName);
cr := nil;
InitXml (cr);
Xml := cr;
st := 0;
_Length := 0;
for L := 0 to Sl.Count - 1 do begin
line := SL[L];
for C := 1 to length (line) do
case st of
0: // initial
if line[C] = "<" then begin
st := 1;
if _Length > 0 then
cr^.Value := trim (cr^.Value + copy (PChar(_Buffer), 1, _Length));
_Length := 0;
end else AddChar (line[C]);
1: // after <
if line[C] = "/" then begin
st := 2;
if cr^.Value <> "" then
if cr^.Value[1] = """ then
if cr^.Value[length(cr^.Value)] = """ then begin
cr^.Value := copy (cr^.Value, 2, length(cr^.Value) - 2);
end;
end else begin
st := 3;
AddChar (line[C]);
end;
2, 3: // after </ or <
if line[C] <> ">" then
AddChar (line[C])
else begin
if st = 2 then
cr := cr^.Parent
else
// if st = 3 then
with cr^ do begin
inc (Count);
if Count > length (Items) then
SetLength (Items, Count + 8);
InitXml (Items[Count-1]);
Items[Count-1].Parent := cr;
cr := Items[Count-1];
cr.Name := copy (PChar(_Buffer), 1, _Length);
end;
st := 0;
_Length := 0;
end;
end; // case
end; // for L := ...
end;
var _Names: array of shortstring;
_NamesCount: integer;
procedure SplitNames (const Names: string);
var i, j: integer;
procedure Add;
begin
if j - i < 2 then exit;
inc (_NamesCount);
if _NamesCount > length (_Names) then
SetLength (_Names, _NamesCount * 2);
_Names[_NamesCount-1] := copy (Names, i + 1, j - i - 1);
i := j;
end;
begin // SplitNames
_NamesCount := 0;
i := 0; j := 1;
while j <= length (Names) do begin
if Names[j] = "." then
Add;
inc (j);
end;
Add;
end;
← →
TUser © (2009-05-24 09:33) [4]
procedure PrintXml (Xml: PXml; const FileName: string);
var f: textfile;
s: shortstring;
function GetVal (const Value: string): string;
var i: integer;
begin
SetLength (result, length (Value));
for i := 1 to length (Value) do
if ord (Value[i]) > 30 then
result[i] := Value[i]
else
result[i] := " ";
if length (result) > 0 then
if (result[1] = " ") or (result[length(result)] = " ") then
result := """ + result + """;
end;
procedure P (X: PXml);
var i: integer;
begin
with X^ do begin
if Count = 0 then
writeln (f, s, "<", Name, ">", GetVal (Value), "</", Name, ">")
else begin
writeln (f, s, "<", Name, ">", GetVal (Value));
s := s + #9;
for i := 0 to Count - 1 do
P (Items[i]);
SetLength (s, length (s) - 1);
writeln (f, s, "</", Name, ">")
end;
end;
end;
var i: integer;
begin // PrintXml;
assignfile (f, FileName);
rewrite (f);
try
s := "";
with Xml^ do
for i := 0 to Count - 1 do
P (Items[i]);
finally
closefile (f);
end;
end;
function GetXmlItem (Xml: PXml; const ItemName: string; Silent: boolean = false): PXml;
var i, j: integer;
f: boolean;
begin
SplitNames (ItemName);
result := Xml;
for i := 0 to _NamesCount - 1 do begin
f := true;
with result^ do
for j := 0 to Count - 1 do
if Items[j].Name = _Names[i] then begin
result := Items[j];
f := false;
break;
end;
if f then begin
if not Silent then
writeln (ItemName, " not found in XML file");
result := nil;
exit;
end;
end;
end;
procedure EnumXmlItems (Xml: PXml; const ItemName: string; Func: TXmlFunc);
var i: integer;
begin
with Xml^ do
for i := 0 to Count - 1 do
if Items[i].Name = ItemName then
if not Func (Items[i]) then
exit;
end;
procedure EnumXmlItemsEx (Root: PXml; const Parents, ItemName: string; Func: TXmlFunc);
begin
EnumXmlItems (GetXmlItem (Root, Parents), ItemName, Func);
end;
function GetStr (Xml: PXml; N: shortstring; const Default: shortstring = ""): shortstring;
begin
Xml := GetXmlItem (Xml, N, true);
if Xml = nil then
result := Default
else
result := Xml.Value;
end;
function GetInt (Xml: PXml; N: shortstring; Default: integer): integer;
var S: string;
begin
S := GetStr (Xml, N);
if S = "" then
result := Default
else result := StrToInt (S);
end;
function IsEqualXmlItems (Xml1, Xml2: PXml): boolean;
var i: integer;
begin
result := (Xml1.Name = Xml2.Name) and
(Xml1.Value = Xml2.Value) and
(Xml1.Count = Xml2.Count);
if result then
for i := 0 to Xml1.Count - 1 do
if not IsEqualXmlItems (Xml1.Items[i], Xml2.Items[i]) then begin
result := false;
exit;
end;
end;
procedure AddItem (Item, NewParent: PXml);
begin
with NewParent^ do begin
inc (Count);
if Count > length (Items) then
SetLength (Items, Count + 8);
Items[Count-1] := Item;
end;
Item.Parent := NewParent;
end;
function AddItem (Parent: PXml; const Name, Value: shortstring): PXml;
begin
result := nil;
InitXml (result);
result.Name := Name;
result.Value := Value;
AddItem (result, Parent);
end;
procedure DelItem (Parent: PXml; Index: integer);
var i: integer;
begin
with Parent^ do begin
for i := Index to Count - 2 do
Items[i] := Items[i+1];
dec (Count);
end;
end;
procedure FreeXml (var Xml: PXml);
var i: integer;
begin
with Xml^ do
for i := 0 to Count - 1 do
FreeXml (Items[i]);
Dispose (Xml);
end;
procedure DelAndFreeItem (Parent: PXml; Index: integer);
begin
FreeXml (Parent.Items[Index]);
DelItem (Parent, Index);
end;
end.
← →
Palladin © (2009-05-24 09:34) [5]Лентяй... но я сегодня добрый. Имплементация для SAX ридера.
Uses
msxml6 ...
Type
_TErrorHandler=Class(TInterfacedObject,IVBSAXErrorHandler)
Private
m_enumLevel:TWRXML2ParseErrorLevelEnum;
m_onError:TWRXML2ParseErrorNotifyEvent;
// IDispatch
Function GetTypeInfoCount(Out Count:Integer):HResult; Stdcall;
Function GetTypeInfo(Index,LocaleID:Integer;Out TypeInfo):HResult; Stdcall;
Function GetIDsOfNames(Const IID:TGUID;Names:Pointer;NameCount,LocaleID:Integer;DispIDs:Pointer):HResult; Stdcall;
Function Invoke(DispID:Integer;Const IID:TGUID;LocaleID:Integer;Flags:Word;Var Params;VarResult,ExcepInfo,ArgErr:Pointer):HResult; Stdcall;
Procedure outerr(Const src:String;const oLocator: IVBSAXLocator; var strErrorMessage: WideString; nErrorCode: Integer);
Procedure error(const oLocator: IVBSAXLocator; var strErrorMessage: WideString; nErrorCode: Integer); safecall;
Procedure fatalError(const oLocator: IVBSAXLocator; var strErrorMessage: WideString; nErrorCode: Integer); safecall;
Procedure ignorableWarning(const oLocator: IVBSAXLocator; var strErrorMessage: WideString;nErrorCode: Integer); safecall;
Public
Constructor Create(p_enumLevel:TWRXML2ParseErrorLevelEnum;p_onError:TWRXML2ParseErrorNotifyE vent);
end;
Constructor _TErrorHandler.Create;Begin m_onError:=p_onError; m_enumLevel:=p_enumLevel;End;
Function _TErrorHandler.GetTypeInfoCount;Begin Result:=E_NOTIMPL;End;
Function _TErrorHandler.GetTypeInfo;Begin Result:=E_NOTIMPL;End;
Function _TErrorHandler.GetIDsOfNames;Begin Result:=E_NOTIMPL;End;
Function _TErrorHandler.Invoke;Begin Result:=E_NOTIMPL;End;
Procedure _TErrorHandler.outerr;
Begin
If @m_onError<>Nil Then m_onError(
"--------------------------------------------------------------------"+CRLF+
"Column:"+_s(oLocator.columnNumber)+CRLF+
"Line:"+_s(oLocator.lineNumber)+CRLF+
"PubID:"+oLocator.publicId+CRLF+
"SysID:"+oLocator.systemId+CRLF+
"ErrorCode:"+_s(nErrorCode)+CRLF+
"Msg:"+strErrorMessage
);
End;
Procedure _TErrorHandler.error;
Begin
If m_enumLevel>=pelError Then
outerr("XML2 parse error",oLocator,strErrorMessage,nErrorCode);
End;
Procedure _TErrorHandler.fatalError;
Begin
If m_enumLevel>=pelFatal Then
outerr("XML2 parse fatal error",oLocator,strErrorMessage,nErrorCode);
End;
Procedure _TErrorHandler.ignorableWarning;
Begin
If m_enumLevel=pelWarnings Then
outerr("XML2 parse warinig",oLocator,strErrorMessage,nErrorCode);
End;
Type
_TFiller=Class(TInterfacedObject,IVBSAXContentHandler)
Private
m_theRoot:IWRXML2Element;
m_theStack:TInterfaceList;
m_aLocator:IVBSAXLocator;
Function LastElement:IWRXML2Element;
// IDispatch
Function GetTypeInfoCount(Out Count:Integer):HResult; Stdcall;
Function GetTypeInfo(Index,LocaleID:Integer;Out TypeInfo):HResult; Stdcall;
Function GetIDsOfNames(Const IID:TGUID;Names:Pointer;NameCount,LocaleID:Integer;DispIDs:Pointer):HResult; Stdcall;
Function Invoke(DispID:Integer;Const IID:TGUID;LocaleID:Integer;Flags:Word;Var Params;VarResult,ExcepInfo,ArgErr:Pointer):HResult; Stdcall;
// IVBASAXContentHandler
Procedure _Set_documentLocator(Const Param1:IVBSAXLocator); Safecall;
Procedure startDocument; Safecall;
Procedure endDocument; Safecall;
Procedure startPrefixMapping(Var strPrefix:WideString;Var strURI:WideString); Safecall;
Procedure endPrefixMapping(Var strPrefix:WideString); Safecall;
Procedure startElement(Var strNamespaceURI,strLocalName,strQName:WideString;Const oAttributes:IVBSAXAttributes); Safecall;
Procedure endElement(Var strNamespaceURI,strLocalName,strQName:WideString); Safecall;
Procedure characters(Var strChars:WideString); Safecall;
Procedure ignorableWhitespace(Var strChars:WideString); Safecall;
Procedure processingInstruction(Var strTarget,strData:WideString); Safecall;
Procedure skippedEntity(Var strName:WideString); Safecall;
Public
Constructor Create;
Destructor Destroy; Override;
Property XML:IWRXML2Element Read m_theRoot Write m_theRoot;
End;
// IDispatch
Function _TFiller.GetTypeInfoCount;Begin Result:=E_NOTIMPL;End;
Function _TFiller.GetTypeInfo;Begin Result:=E_NOTIMPL;End;
Function _TFiller.GetIDsOfNames;Begin Result:=E_NOTIMPL;End;
Function _TFiller.Invoke;Begin Result:=E_NOTIMPL;End;
// IVBASAXContentHandler
Procedure _TFiller._Set_documentLocator;Begin m_aLocator:=Param1;End;
Procedure _TFiller.startDocument;Begin End;
Procedure _TFiller.endDocument;Begin End;
Procedure _TFiller.startPrefixMapping;Begin End;
Procedure _TFiller.endPrefixMapping;Begin End;
Procedure _TFiller.ignorableWhitespace;Begin End;
Procedure _TFiller.processingInstruction;Begin End;
Procedure _TFiller.skippedEntity;Begin End;
Procedure _TFiller.startElement;
Var
i:Integer;
x:IWRXML2Element;
Begin
If m_theStack.Count=0 Then
Begin
x:=TWRXML2Element.Create as IWRXML2Element;
x.SetTagName(strLocalName);
m_theRoot:=x;
End Else x:=LastElement.GetElements.CreateElement(strLocalName);
m_theStack.Add(x);
For i:=0 to oAttributes.length-1 Do
x.GetAttrs.Add(oAttributes.getLocalName(i),oAttributes.getValue(i));
End;
Procedure _TFiller.endElement;
Begin
m_theStack.Delete(m_theStack.Count-1);
End;
Procedure _TFiller.characters;
Var
x:IWRXML2Element;
s:String;
Begin
x:=LastElement;
s:=strChars;
If (x.GetData="") and (s<>#10) and (s<>#32) Then x.SetData(s) Else
If x.GetData="" Then x.SetData(s) Else x.SetData(x.GetData+s);
End;
Function _TFiller.LastElement;
Begin
Result:=IWRXML2Element(m_theStack[m_theStack.Count-1]);
End;
Constructor _TFiller.Create;
Begin
Inherited;
m_theStack:=TInterfaceList.Create;
End;
Destructor _TFiller.Destroy;
Begin
m_theStack.Free;
Inherited;
End;
Class Function TXML2Manager.CreateFromFile(Const p_strFileName:String;p_onParseError:TWRXML2ParseErrorNotifyEvent=Nil;Const p_enumLogErrorLevel:TWRXML2ParseErrorLevelEnum=pelFatal):IWRXML2Elements;
Var
SAX:IVBSAXXMLReader;
CH:_TFiller;
Begin
SAX:=CoSAXXMLReader60.Create;
Result:=TWRXML2Elements.Create as IWRXML2Elements;
Try
CH:=_TFiller.Create;
SAX.contentHandler:=CH as IVBSAXContentHandler;
SAX.errorHandler:=_TErrorHandler.Create(p_enumLogErrorLevel,p_onParseError) as IVBSAXErrorHandler;
SAX.baseURL:="file:///"+p_strFileName;
SAX.parseURL("file:///"+p_strFileName);
Result.Add(CH.XML);
Except
Result:=Nil;
End;
End;
Class Function TXML2Manager.CreateFromSource(Const s:String;p_onParseError:TWRXML2ParseErrorNotifyEvent=Nil;Const p_enumLogErrorLevel:TWRXML2ParseErrorLevelEnum=pelFatal):IWRXML2Elements;
Var
SAX:IVBSAXXMLReader;
CH:_TFiller;
Begin
SAX:=CoSAXXMLReader60.Create;
Result:=TWRXML2Elements.Create as IWRXML2Elements;
Try
CH:=_TFiller.Create;
SAX.contentHandler:=CH as IVBSAXContentHandler;
SAX.errorHandler:=_TErrorHandler.Create(p_enumLogErrorLevel,p_onParseError) as IVBSAXErrorHandler;
SAX.parse(s);
Result.Add(CH.XML);
Except
Result:=Nil;
End;
End;
классы-контейнеры свои выдумывай...
← →
uw © (2009-05-24 09:42) [6]ggg © (24.05.09 07:15)
Подскажите готовый класс.
Есть такой - TXMLDocument.
← →
T&F (2009-05-24 09:55) [7]
> TXMLDocument
Тормознутый
Насчёт парсеров - тоже актуальный вопрос для меня. Хочется услышать мнение об OmniXML. Что за зверь? Кто с ним работал? С чем можно сравнить по скорости? В идеале бы даже неплохо кусочек кода, чтобы оценить основные возможности, но это уже второстепенное
← →
sniknik © (2009-05-24 12:38) [8]> Решил все настройки/данные программы хранить в XML,
это было ошибочное решение...
> вроде бы просто и удобно.
а это заблуждение.
удобно, как же, сравни с ini файлами или реестром.
имхо, использования XML следует избегать! если только нет реальной необходимости, например хранение сложных структур, или вынужденности, например работа с чужими данными идущими в нем/договоренности обмена в нем.
← →
Игорь Шевченко © (2009-05-24 13:06) [9]
> имхо, использования XML следует избегать!
Не следует
← →
Eraser © (2009-05-24 14:21) [10]> [7] T&F (24.05.09 09:55)
>
> > TXMLDocument
>
> Тормознутый
ну-ну
← →
Palladin © (2009-05-24 14:23) [11]
> Eraser © (24.05.09 14:21) [10]
тормозной тормозной :) 2mb 30 сек парсит, негодяй... другое дело SAX )
← →
ggg © (2009-05-24 14:57) [12]>это было ошибочное решение...
Что плохого в стандартизации?
>удобно, как же, сравни с ini файлами или реестром.
ini морально устарел, неудобно хранить древовидные структуры, списки, матрицы.
Реестр - проблемы с передачей данных, да и вообще это большая свалка.
>классы-контейнеры свои выдумывай...
Раз другого варианта нет, ну напишу я этот велосипед.
Т.е. за 11 лет существования XML не было написано ни одного парсера/класса-контейнера, который бы быстро безошибочно читал данные и не вываливался на больших файлах? Смешно.
← →
Palladin © (2009-05-24 15:09) [13]
> Т.е. за 11 лет существования XML не было написано ни одного
> парсера/класса-контейнера
Отчего же, TXMLDocument, наслаждайся, но лично меня не устраивала скорость и удобство работы с ним, контейнер я себе свой разработал. И счАстливо работаю с ним уже больше года. Тебе дать его не могу, ибо тянет за собой кучу других библиотек классов, так же разработанных мной.
← →
Palladin © (2009-05-24 15:12) [14]Они, контейнеры, и вообще, действия при SAX парсинге, вообще то сильно различатся могут, бо зависят от конкретной цели парсинга. TXMLDocument самый универсальный контейнер.
← →
тимохов © (2009-05-24 15:16) [15]Поддерживаю Палладина - XML для хранения настроек нужно использовать, когда нет другой возможности. По моему имху простая структура INI или реестра - есть вполне вменяемый формат хранения для большинства настроек. Дописать хранения списков и матриц - плевое дело.
← →
Eraser © (2009-05-24 15:27) [16]> [11] Palladin © (24.05.09 14:23)
ну тормознутость - понятие относительное. ясное дело, что для спец. задачи можно написать быстрый простой парсер. только вот если нет критических требований к производительности лучше доморощенные спец. средства не использовать по-моему, т.к. пока на каждый чих будешь писать спецальный инструмент - конкуренты 10-ю версию программы уже выпустят, imho.
← →
Palladin © (2009-05-24 15:31) [17]
> Eraser © (24.05.09 15:27) [16]
Я не писал свой парсер, я воспользоватлся SAX парсером. SAX это тоже msxml если что... TXMLDocument это просто уже готовый контейнер от ms. Остальное читай в [13],[14]
> тимохов © (24.05.09 15:16) [15]
Я думаю ты больше согласен с sniknik"ом чем со мной ) Я как раз не против использования XML формата для хранения настроек и опций ), особенно когда один контейнер отвечает за сразу несколько продуктов....
← →
Игорь Шевченко © (2009-05-24 15:34) [18]тимохов © (24.05.09 15:16) [15]
Блин. И ты туда же. Корректность XML может быть проверена стандартными готовыми средствами, в случае ini, реестра, текстовых файлов тебе каждый раз придется писать проверки на корректность данных при изменениях формата, состава и т.п.
ini-файл годится для простых описаний, типа
параметр=значение, да и то, если в написании параметра ошиблись, то ошибку не сразу найдешь :)
и у ini-файла есть один существенный недостаток - стандартные средства записи в него настолько тормозные, что это видно невооруженным глазом.
← →
Леша © (2009-05-24 15:43) [19]TXMLDocument тем хорош, что существует такая штука, как XML Binding. Т.е. рисуешь в отдельном файле свой XML, со всеми предусмотренными структурами и типами. Потом этот файл скармливаешь утилите. И она тебе строит объектную модель.
← →
Eraser © (2009-05-24 15:45) [20]> [17] Palladin © (24.05.09 15:31)
> SAX это тоже msxml если что...
а я все думаю, что за сакс )
ну TXMLDocument хоть и контейнер, но простенький.
← →
Palladin © (2009-05-24 15:52) [21]
> а я все думаю, что за сакс )
не путать с суксем! :)
> ну TXMLDocument хоть и контейнер, но простенький.
да уж... атрибуты и узлы, по сути, абсолютно разные вещи, однако какому то гению в ms пришла в голову определить аттрибут узла в узел )
← →
Кто б сомневался © (2009-05-24 16:12) [22]Имхо в ini и удобнее хранить и он быстрее работает и проще просматривать юзеру. Это не имхо - это очевидный факт. Другое дело дань моде...
← →
Palladin © (2009-05-24 16:18) [23]
> Кто б сомневался © (24.05.09 16:12) [22]
самое страшное, что например, Reget настройки в xml хранит давным давно уже.... и кто заморачивался на "он быстрее работает и проще просматривать юзеру."? а на счет "быстрее работает" я бы еще поспорил...
← →
DVM © (2009-05-24 16:28) [24]пользователям плевать как хранит данные программа, ни в ини не в иксэмэль они глядеть не будут.
← →
Игорь Шевченко © (2009-05-24 17:23) [25]
> пользователям плевать как хранит данные программа, ни в
> ини не в иксэмэль они глядеть не будут.
не надо говорить за всех
← →
sniknik © (2009-05-24 17:29) [26]> Другое дело дань моде...
так и есть, мода и еще бы добавил хороший менеджмент раскрутивший миф о нем как о "удобном и универсальном" (то что он нужен буквально везде это уже отсебятина некоторых особо усердных программистов. имхо.).
кто считает, что мифа нет, объясните одну простую вещь, почему никто из менеджерского отдела про json (аналог xml только не от мелкософта) ни слухом ни духом, а про xml это у них первый вопрос когда программу представляешь, еще до вопроса "что она делает?" спрашивают "а она xml поддерживает?".
вот почему?
← →
ggg © (2009-05-24 17:42) [27]>а про xml это у них первый вопрос когда программу представляешь, еще до вопроса "что она делает?" спрашивают "а она xml поддерживает?"
Заботятся о совместимости?
В общем TXMLDocument прикручиваю. Пусть будет медленно и надежно.
ЗЫ INI vs XML - новый холивар? =\
← →
Игорь Шевченко © (2009-05-24 17:52) [28]sniknik © (24.05.09 17:29) [26]
> миф о нем как о "удобном и универсальном"
Вооьще-то это не миф, действительно удобен и универсален. Другое дело, если кто разок обжегся на бэкапах базы в XML и теперь дует повсюду, где видит XML - ну так это его личные неприятности и к удобству и универсальности xml отношения не имеют.
> почему никто из менеджерского отдела про json (аналог xml
> только не от мелкософта) ни слухом ни духом, а про xml это
> у них первый вопрос
Ну кто ж тебе может растолковать позицию твоего менеджерского отдела ?
← →
Palladin © (2009-05-24 17:52) [29]
> почему никто из менеджерского отдела про json (аналог xml
> только не от мелкософта) ни слухом ни духом
эмнь (с) Розыч
собсна вообще то у них разные предназначения, теплое с мягким ткскть.... json ни разу не аналог xml, а лишь синтаксис текстового определения содержимого [анонимного]объекта в JavaScript.... а что манагеры не знают, так это их минус(проблемы)...
← →
Palladin © (2009-05-24 18:01) [30]
> Вооьще-то это не миф, действительно удобен и универсален.
Ну, лично я, сказал бы что он более универсален чем удобен. Просто кто то, в виде MS, решился внести наконец то какой то порядок в нишу определения структурных данных. Другое дело манагеры (и маркетинговый отдел), которые в силу своей недалекости и недюжей страстью к пропихиванию преподнесли это как очередное лекарство от рака... ну чего с идиотов взять то... главное не вестись
← →
Иа (2009-05-24 18:16) [31]В Delphi (VCL) до сих пор нет стандартного способа хранения настроек?
http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx
← →
sniknik © (2009-05-24 18:19) [32]> если кто разок обжегся на бэкапах базы в XML
а если кто ни разу ни обжегся, и не хочет, но все вокруг постоянно пытаются его обжечь подсовывая этот самый xml вместо того что реально нужно?
> json ни разу не аналог xml
все что можно на xml можно и на json и сложные структуры и деревья, все. т.что по функциональности это полный аналог. по простоте в использовании конечно нет, т.к. очевидно проще.
> а лишь синтаксис текстового определения содержимого [анонимного]объекта в JavaScript.
ну да, а xml это просто синтаксис текстового определения содержимого объекта TXMLDocument.
???
и какая разница? а вот то, что json очень просто преобразовывается в объект JavaScript это очевидное удобство когда работаешь с html и JavaScript (веб интерфейс например к программе прикручиваешь)
← →
Игорь Шевченко © (2009-05-24 18:34) [33]
> Ну, лично я, сказал бы что он более универсален чем удобен.
> Просто кто то, в виде MS, решился внести наконец то какой
> то порядок в нишу определения структурных данных
Вообще-то не MS, вообще-то W3C
"XML был разработан рабочей группой из 11 человек при поддержке около 150 заинтересованных разработчиков. Члены рабочей группы никогда не встречались лицом к лицу — все технические дискуссии происходили в почтовой переписке, а вопросы решались поиском компромисса и, в сложных случаях, голосованием рабочей группы. Основные технические решения были найдены в течение 20 недель интенсивной работы с июля по ноябрь 1996 года, когда был опубликован рабочий черновик спецификации XML. В дальнейшем работа была продолжена, и 10 февраля 1998 года XML обрел статус рекомендованного стандарта."
← →
Игорь Шевченко © (2009-05-24 18:35) [34]sniknik © (24.05.09 18:19) [32]
> а если кто ни разу ни обжегся, и не хочет, но все вокруг
> постоянно пытаются его обжечь подсовывая этот самый xml
> вместо того что реально нужно?
Я к чему - не стоит делать далеко идущие рекомендации из собственной неудачной практики
← →
Palladin © (2009-05-24 18:49) [35]
> Вообще-то не MS, вообще-то W3C
ну да... а жестко пихал то его кто? W3C? и был бы он в забытье...
← →
Игорь Шевченко © (2009-05-24 18:51) [36]Palladin © (24.05.09 18:49) [35]
> ну да... а жестко пихал то его кто?
Не в курсе. Расскажешь ?
Кроме того, я извиняюсь, а в Unix/Linux его тоже MS пихала ? :)
← →
Palladin © (2009-05-24 18:51) [37]
> ну да, а xml это просто синтаксис текстового определения
> содержимого объекта TXMLDocument.
брр... там куда все сложнее чем ты можешь себе представить... как Игорь уже упомянул, один только стандарт для DD XML стоит толпы строчек кода валидации json... которому валидация нафих не нужна по причине не строгости типизации в JS...
← →
Palladin © (2009-05-24 18:55) [38]
> Кроме того, я извиняюсь, а в Unix/Linux его тоже MS пихала
> ? :)
нет, просто "куда все туда и мы"... не вылез бы XML за пределы linux как и остальные толпы linux придумок... бо там подобных велосипедов выше крыши... и как то (типа) случайно MS понравился XML, который не сильно-то по началу признание в nix"ах получил...
кстати, json вылез бы, запросто... только опоздал... потому получил жесткое специализированное поле применения...
← →
Игорь Шевченко © (2009-05-24 18:59) [39]Palladin © (24.05.09 18:55) [38]
Странно, не слышал о проталкивании MS-ом XML. Это исторический факт или предположение ? :)
← →
Palladin © (2009-05-24 19:01) [40]
> Игорь Шевченко © (24.05.09 18:59) [39]
хм ) с твоего позволения я проведу соц. опрос )
Страницы: 1 2 3 4 вся ветка
Форум: "Прочее";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.006 c