Autor Téma: xmldokument problem  (Přečteno 470 krát)

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
xmldokument problem
« kdy: 22-11-2017, 10:48:44 »
mam taketo XML
Kód: Delphi [Vybrat]
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Cennik>
  3.   <product>
  4.     <nazov>bla bla bla</nazov>
  5.     <nazov2>brekeke</nazov2>
  6.   </product>
  7. </Cennik>
  8.  

a atkýto kód
Kód: Delphi [Vybrat]
  1.    XMLDoc.Active:=True;
  2.    StartItemNode := XMLDoc.DocumentElement.ChildNodes.FindNode('product');
  3.  

samozrejme ze mi to načíta, ale pri pokuse FindNode mi to ide do chyby "Invalid Pointer Operation"

ako teda na to?

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:xmldokument problem
« Odpověď #1 kdy: 22-11-2017, 11:20:01 »

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:xmldokument problem
« Odpověď #2 kdy: 22-11-2017, 17:40:06 »
fdaka už to študujem (a to som si myslel, že to viem)

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:xmldokument problem
« Odpověď #3 kdy: 22-11-2017, 17:43:17 »
no takže mi to príde trocha chaotické používať atribúty a elementy na rozdielne účely (uloženie hodnôt), či?
ako potom napísať univerzálny parser?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1866
  • Karma: 91
    • Verze Delphi: D2007, XE3, DX10
Re:xmldokument problem
« Odpověď #4 kdy: 22-11-2017, 17:52:21 »
no takže mi to príde trocha chaotické používať atribúty a elementy na rozdielne účely (uloženie hodnôt), či?
ako potom napísať univerzálny parser?
Interpretaci XSD ev. DTD pravidel - cili prakticky skoro nijak ;-)

Muzes vzit XML wizarda z Delphi, predhodit mu XSD, DTD nebo vzorek XML souboru a on ti vytvori objektovou reprezentaci DOM modelu dokumentu. Pokud si na tom wizard nevylame zuby a model vytvori, tak s tim muzes pracovat jako s beznymi objekty.

A kdyz se ti objevi jiny soubor, tak si vytvoris novy DOM model etc...

Akorat ten DOM model neni vhodny pro velke zmloky dat, protoze je cely v pameti.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1866
  • Karma: 91
    • Verze Delphi: D2007, XE3, DX10
Re:xmldokument problem
« Odpověď #5 kdy: 22-11-2017, 17:56:42 »
no takže mi to príde trocha chaotické používať atribúty a elementy na rozdielne účely (uloženie hodnôt), či?
Aspon se zda, ze tvurcum rozhrani MIDAS v Delphi tj. napr. underlying XML data pro TClientDataSet to prislo taky matouci, protoze udelali (snad z nepochopeni) prasarnu, ze element = jeden radek v result setu a jeho fields = atributy :-(


Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:xmldokument problem
« Odpověď #6 kdy: 22-11-2017, 18:05:35 »
v dnešnej dobe 16GB RAM a nvme SSD by to nemal byť problém pre 100MB XML súbory, či?

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:xmldokument problem
« Odpověď #7 kdy: 22-11-2017, 18:08:58 »
Kód: Delphi [Vybrat]
  1.    while Assigned(ANode) do
  2.    begin
  3.      count := ANode.AttributeNodes.Count ;
  4.      for I := 0 to count - 1 do
  5.        begin
  6.          if Memo2.Lines.IndexOf(ANode.AttributeNodes.Nodes[i].NodeName) = -1 then
  7.                    Memo2.Lines.Add(ANode.AttributeNodes.Nodes[i].NodeName) ;
  8.        end;
  9.      ANode := ANode.NextSibling;
  10.    end;

riešenie mojej otazky (ale len na dokument s hodnotami v atribútoch), ale musím si najskôr očekovať celé XML-ko, aby som zistil všetky použité atribúty (našťastie to trvá zanedbateľný čas cca do 1s)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1866
  • Karma: 91
    • Verze Delphi: D2007, XE3, DX10
Re:xmldokument problem
« Odpověď #8 kdy: 22-11-2017, 18:09:58 »
v dnešnej dobe 16GB RAM a nvme SSD by to nemal byť problém pre 100MB XML súbory, či?
100MB soubor taky neni zadnej velkej zmolek dat ;-)

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:xmldokument problem
« Odpověď #9 kdy: 23-11-2017, 09:22:10 »
ešte jedna záludná otázka.
Pre XML súbory do cca 100MB je aká najvhodnejšia (rozumej najrýchlejšia) jednosmerná metóda na prečítanie dát z XML a uloženie do DB.
(doteraz používam transformácie cez TXMLTransformProvider - je to super univerzálne na rôzne štruktúry dát (mám ku každemu *.xtr) ale predpokladám, že vyššie popisovaná metóda (DOM?) by mohla byť rýchlejšia, a čítal som dačo o SAX, ale neporozumel som)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1866
  • Karma: 91
    • Verze Delphi: D2007, XE3, DX10
Re:xmldokument problem
« Odpověď #10 kdy: 23-11-2017, 09:34:49 »
Pre XML súbory do cca 100MB je aká najvhodnejšia (rozumej najrýchlejšia) jednosmerná metóda na prečítanie dát z XML a uloženie do DB.
(doteraz používam transformácie cez TXMLTransformProvider - je to super univerzálne na rôzne štruktúry dát (mám ku každemu *.xtr) ale predpokladám, že vyššie popisovaná metóda (DOM?) by mohla byť rýchlejšia, a čítal som dačo o SAX, ale neporozumel som)
DOM znamena, ze se text rozlozi na prvky a sestavi se ve stejne strukture v pameti, takze je tam cely naraz. Jak je to rychle oproti transformaci nevim, protoze tu jsem nikdy nepouzil. SAX je prubezny parser, ktery vyvolava udalosti OnXXX na lexikalni prvky a je na tobe, jak si z toho obsah poskladas. Takze vlastni zpracovani byva velmi rychle.

Kdysi, kdyz jsem potreboval zpracovavat XML soubory, ktere nejak rucne vyprasili PHP strikaci jako kdyz prasili HTML na webu, tak jsem si napsal prubezny parser a pomoci nej se ten XML upravoval do validniho stavu. Teoreticky bych to mohl poskytnout, ale prakticky to nebude k nicemu, protoze je to jeste v ANSI a je to napsane pro nas proprietarni framework a knihovny

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:xmldokument problem
« Odpověď #11 kdy: 23-11-2017, 11:04:41 »
Ten tvoj parser možno na ukážku ako výučbový materiál by to stálo za to.
našiel som aj toto http://delphi.cz/post/OXml-The-next-generation-XML-library-for-Pascal.aspx


Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1866
  • Karma: 91
    • Verze Delphi: D2007, XE3, DX10
Re:xmldokument problem
« Odpověď #12 kdy: 23-11-2017, 13:40:32 »
Ten tvoj parser možno na ukážku ako výučbový materiál by to stálo za to.
našiel som aj toto http://delphi.cz/post/OXml-The-next-generation-XML-library-for-Pascal.aspx
Ja to tenkrat musel rychle vyprasit, protoze nic nebylo resp. to co bylo chtelo validni dokumenty... Kdyz si prectes diskusi pod tim parserem od Oxo, tak tam maji nejaky SimpleXML a buhvi co jeste. Takze dneska nejspis nema cenu se zabyvat vlastnim parserem, pokud nechces konkukrovat Oxovi :-)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1866
  • Karma: 91
    • Verze Delphi: D2007, XE3, DX10
Re:xmldokument problem
« Odpověď #13 kdy: 23-11-2017, 13:55:10 »
Ten tvoj parser možno na ukážku ako výučbový materiál by to stálo za to.

Kód: Delphi [Vybrat]
  1. //------------------------------------------------------------------------------
  2.                                   TYPE
  3. //------------------------------------------------------------------------------
  4.   eMarkupLanguageToken  = (etokNone,etokTagOpen,etokTagClose,etokTagSolitair,
  5.                            etokTagProc,etokTagDecl,etokTagInclude,etokTagComment,etokTagScript,
  6.                            etokTagCDATA,etokText,etokUnicodeBOM);
  7.   tMarkupLanguageToken  = set of eMarkupLanguageToken;
  8.  
  9.  
  10.   TOnTagEvent     = procedure (Sender:TObject; ATag: ANSIString; AAttributes:TStrings) of Object;
  11.   TOnTextEvent    = procedure (Sender:TObject; const AText:ANSIString) of Object;
  12.   TOnIncludeEvent = procedure (Sender:TObject; const ACommand:ANSIString; AAttributes:TStrings; var ABuffer:PChar; var ABufSize:integer) of object;
  13.  
  14.  
  15.   TMarkupLanguageParser = class
  16.   strict protected
  17.     FOnTag:            TOnTagEvent;
  18.     FOnText:           TOnTextEvent;
  19.     FOnInclude:        TOnTextEvent;
  20.     FAttributes:       TStringList;
  21.   strict protected
  22.     procedure          _ReportTag    (const ABuffer; var ALTPos,AGTPos:integer);
  23.     procedure          _ReportText   (const ABuffer; var ALTPos,AGTPos:integer);
  24.     procedure          _AppendText   (const ABuffer; var ALTPos,AGTPos:integer);
  25.     procedure          _ReportInclude(const ABuffer; var ALTPos,AGTPos:integer);
  26.   public
  27.     function           Preprocess(const ABuffer; ASize:integer): boolean; overload;
  28.     function           Preprocess(const HTML:ANSIString):        boolean; overload;
  29.     function           Preprocess(HTML:TStream):                 boolean; overload;
  30.     function           Parse     (const ABuffer; ASize:integer): boolean; overload;
  31.     function           Parse     (const HTML:ANSIString):        boolean; overload;
  32.     function           Parse     (HTML:TStream):                 boolean; overload;
  33.     constructor        Create;
  34.     destructor         Destroy; override;
  35.   //published
  36.   public
  37.     property OnInclude: TOnTextEvent read FOnInclude write FOnInclude;
  38.     property OnTag:     TOnTagEvent  read FOnTag     write FOnTag;
  39.     property OnText:    TOnTextEvent read FOnText    write FOnText;
  40.   end;
  41.  
  42. //==============================================================================
  43. //
  44. //{O} TMarkupLanguageParser
  45. //
  46. //==============================================================================
  47.  
  48.  
  49.   //------------+---------------------------------------------------------------
  50.     constructor TMarkupLanguageParser.Create;
  51.   //------------+---------------------------------------------------------------
  52.     begin
  53.       inherited Create;
  54.       FAttributes := TStringList.Create;
  55.     end;
  56.  
  57.   //------------+---------------------------------------------------------------
  58.     destructor  TMarkupLanguageParser.Destroy;
  59.   //------------+---------------------------------------------------------------
  60.     begin
  61.       FAttributes.Free;
  62.       inherited Destroy;
  63.     end;
  64.  
  65.     function HandleWhiteSpaces(ACh:Char; var ASpace:boolean): ANSIString;
  66.     const
  67.       cWhiteSpaceChars: set of char = [#1..' '];
  68.     begin
  69.       if (ACh in cWhiteSpaceChars) then
  70.         begin
  71.           if ASpace then
  72.             Result := sz
  73.           else
  74.             begin
  75.               Result := ' ';
  76.               ASpace := TRUE;
  77.             end;
  78.         end
  79.       else
  80.         begin
  81.           Result := ACh;
  82.           ASpace := FALSE;
  83.         end;
  84.     end;
  85.  
  86.     function UnquoteString(const S:ANSIString): ANSIString;
  87.     var
  88.       i: integer;
  89.     begin
  90.       Result := sz;
  91.       for i:=1 to Length(S) do
  92.         begin
  93.           if (S[i]<>'"') and (S[i]<>'''') then  {!}{???}
  94.             Result := Result+S[i];
  95.         end;
  96.     end;
  97.  
  98.     function CopyTagName(S: ANSIString): ANSIString;
  99.     var
  100.       x: integer;
  101.     begin
  102.       x := Pos(' ',S);
  103.       if x=0 then
  104.         x := Pos('>',S);
  105.       Result := Copy(S,2,x-2);
  106.     end;
  107.  
  108.     procedure ToLower(var AAttr:ANSIString);
  109.     var
  110.       i: integer;
  111.       S: ANSIString;
  112.     begin
  113.       i := 1;
  114.       while (i<=length(AAttr)) and (AAttr[i]<>'=') do
  115.         inc(i);
  116.       S := ANSILowerCase(copy(AAttr,1,i-1));
  117.       move(S[1],AAttr[1],length(S));
  118.     end;
  119.  
  120.     procedure ParseTagAttributes(ATag: ANSIString; AAttributes:TStrings);
  121.     const
  122.       cDelimiters: set of char = [' ','<','>'];
  123.     var
  124.       i:     integer;
  125.       S:     ANSIString;
  126.       OnStr: Boolean;
  127.     begin
  128.       AAttributes.Clear;
  129.       OnStr := FALSE;
  130.       for i:=1 to Length(ATag) do
  131.         begin
  132.           if ATag[i]='"' then
  133.             OnStr := not OnStr;
  134.           if (ATag[i] in cDelimiters) and (not OnStr) then
  135.             begin
  136.               if length(S)>0 then
  137.                 begin
  138.                   ToLower(S);
  139.                   AAttributes.Add(UnquoteString(S));
  140.                 end;
  141.               S := sz;
  142.             end
  143.           else
  144.             S := S+ATag[i];
  145.         end;
  146.     end;
  147.  
  148.   //------------+---------------------------------------------------------------
  149.     procedure   TMarkupLanguageParser._ReportTag
  150.                 (const ABuffer; var ALTPos,AGTPos:integer);
  151.   //------------+---------------------------------------------------------------
  152.     var
  153.       Lng:   integer;
  154.       PC:    pChar;
  155.       Token: ANSIString;
  156.     begin
  157.       Lng := AGTPos-ALTPos;
  158.       if Lng>0 then
  159.         begin
  160.           PC := pChar(integer(addr(ABuffer))+ALTPos);
  161.           SetLength(Token,Lng);
  162.           system.move(PC^,Token[1],Lng);
  163.           if Assigned(FOnTag) then
  164.             FOnTag(Self,Token,nil);
  165.         end;
  166.       ALTPos := AGTPos;
  167.     end;
  168.  
  169.   //------------+---------------------------------------------------------------
  170.     procedure   TMarkupLanguageParser._ReportText
  171.                 (const ABuffer; var ALTPos,AGTPos:integer);
  172.   //------------+---------------------------------------------------------------
  173.     var
  174.       Lng:   integer;
  175.       PC:    pChar;
  176.       Token: ANSIString;
  177.     begin
  178.       Lng := ALTPos-AGTPos;
  179.       if Lng>0 then
  180.         begin
  181.           PC := pChar(integer(addr(ABuffer))+AGTPos);
  182.           SetLength(Token,Lng);
  183.           system.move(PC^,Token[1],Lng);
  184.           Token := astrrbo(astrreplcc(Token));
  185.           if Assigned(FOnText) and (Token<>sz) then
  186.             FOnText(Self,Token);
  187.         end;
  188.     end;
  189.  
  190.   //------------+---------------------------------------------------------------
  191.     procedure   TMarkupLanguageParser._AppendText
  192.                 (const ABuffer; var ALTPos,AGTPos:integer);
  193.   //------------+---------------------------------------------------------------
  194.     var
  195.       Lng:   integer;
  196.       PC:    pChar;
  197.       Token: ANSIString;
  198.     begin
  199.       Lng := ALTPos-AGTPos;
  200.       if Lng>0 then
  201.         begin
  202.           PC := pChar(integer(addr(ABuffer))+AGTPos);
  203.           SetLength(Token,Lng);
  204.           system.move(PC^,Token[1],Lng);
  205.           Token := astrrbo(astrreplcc(Token));
  206.           if Assigned(FOnText) and (Token<>sz) then
  207.             FOnText(Self,Token);
  208.         end;
  209.     end;
  210.  
  211.   //------------+---------------------------------------------------------------
  212.     procedure   TMarkupLanguageParser._ReportInclude
  213.                 (const ABuffer; var ALTPos,AGTPos:integer);
  214.   //------------+---------------------------------------------------------------
  215.     var
  216.       Lng:   integer;
  217.       PC:    pChar;
  218.       Token: ANSIString;
  219.     begin
  220.       Lng := AGTPos-ALTPos;
  221.       if Lng>0 then
  222.         begin
  223.           PC := pChar(integer(addr(ABuffer))+ALTPos);
  224.           SetLength(Token,Lng);
  225.           system.move(PC^,Token[1],Lng);
  226.           if Assigned(FOnInclude) then
  227.             FOnInclude(Self,Token);
  228.         end;
  229.       ALTPos := AGTPos;
  230.     end;
  231.  
  232.   //------------+---------------------------------------------------------------
  233.     function    TMarkupLanguageParser.Preprocess
  234.                 (const ABuffer; ASize:integer): boolean;
  235.   //------------+---------------------------------------------------------------
  236.     var
  237.       LTPos: integer;
  238.       GTPos: integer;
  239.     begin
  240.       Result  := TRUE;
  241.       if ASize<=0 then
  242.         exit;
  243.       //
  244.       LTPos := 0;
  245.       GTPos := 0;
  246.       repeat
  247.         // Replace <!--# ..... --> comments
  248.         if abufSameSubStr('<!--#',addr(ABuffer),ASize,LTPos) then
  249.           begin
  250.             GTPos := abufFindSubStrEnd('-->',addr(ABuffer),ASize,LTPos+5);
  251.             if GTPos<0 then
  252.               exit;
  253.             _ReportInclude(ABuffer,LTPos,GTPos);
  254.           end
  255.         // Copy text between comments
  256.         else
  257.           begin
  258.             LTPos := aBufFindSubStr('<!--#',addr(ABuffer),ASize,GTPos+1);
  259.             if LTPos<0 then
  260.               begin
  261.                 LTPos := ASize;
  262.                 _AppendText(ABuffer,LTPos,GTPos);
  263.                 exit;
  264.               end;
  265.             _AppendText(ABuffer,LTPos,GTPos);
  266.           end;
  267.       until FALSE;
  268.     end;
  269.  
  270.   //------------+---------------------------------------------------------------
  271.     function    TMarkupLanguageParser.Preprocess
  272.                 (const HTML:ANSIString): boolean;
  273.   //------------+---------------------------------------------------------------
  274.     begin
  275.       Result := FALSE;
  276.       if HTML<>sz then
  277.         Result := Preprocess(HTML[1],length(HTML));
  278.     end;
  279.  
  280.   //------------+---------------------------------------------------------------
  281.     function    TMarkupLanguageParser.Preprocess
  282.                 (HTML:TStream): boolean;
  283.   //------------+---------------------------------------------------------------
  284.     var
  285.       Buf: ANSIString;
  286.     begin
  287.       Result := FALSE;
  288.       if HTML.Size<=0 then
  289.         exit;
  290.       Setlength(Buf,HTML.Size);
  291.       HTML.ReadBuffer(Buf[1],length(Buf));
  292.       Result := Preprocess(Buf[1],length(Buf));
  293.     end;
  294.  
  295.  
  296.   //------------+---------------------------------------------------------------
  297.     function    TMarkupLanguageParser.Parse
  298.                 (const ABuffer; ASize:integer): boolean;
  299.   //------------+---------------------------------------------------------------
  300.     var
  301.       LTPos:   integer;
  302.       GTPos:   integer;
  303.       Pos1:    integer;
  304.       Pos2:    integer;
  305.       PC:      pChar;
  306.     begin
  307.       Result := FALSE;
  308.       if ASize<=0 then
  309.         exit;
  310.       LTPos := 0;
  311.       GTPos := 0;
  312.       repeat
  313.         PC := PChar(integer(addr(ABuffer))+LTPos);
  314.         if PC^='<' then
  315.           begin
  316.             inc(PC);
  317.             // XML root
  318.             if abufSameSubStr('<?',addr(ABuffer),ASize,LTPos) then
  319.               GTPos := abufFindSubStrEnd('?>',addr(ABuffer),ASize,LTPos+2)
  320.             // Script
  321.             else if abufSameSubStr('<%',addr(ABuffer),ASize,LTPos) then
  322.               GTPos := abufFindSubStrEnd('%>',addr(ABuffer),ASize,LTPos+2)
  323.             // Comment
  324.             else if PC^='!' then
  325.               begin
  326.                 if abufSameSubStr('<!--',addr(ABuffer),ASize,LTPos) then
  327.                   GTPos := abufFindSubStrEnd('-->',addr(ABuffer),ASize,LTPos+4)
  328.                 else if abufSameSubStr('<![',addr(ABuffer),ASize,LTPos) then
  329.                   GTPos := abufFindSubStrEnd(']]>',addr(ABuffer),ASize,LTPos+2)
  330.                 else if abufSameSubStr('<!DOCTYPE',addr(ABuffer),ASize,LTPos) then
  331.                   begin
  332.                     Pos1  := abufFindSubStrSkipQuoted   ('[',addr(ABuffer),ASize,LTPos+9);
  333.                     Pos2  := abufFindSubStrEndSkipQuoted('>',addr(ABuffer),ASize,LTPos+1);
  334.                     if (Pos1>=0) and (Pos1<Pos2) then
  335.                       GTPos := abufFindSubStrEnd(']>',addr(ABuffer),ASize,Pos1+1)
  336.                     else
  337.                       GTPos := Pos2;
  338.                   end
  339.                 else
  340.                   GTPos := abufFindSubStrEndSkipQuoted('>',addr(ABuffer),ASize,LTPos+1);
  341.               end
  342.             // Search for ">"
  343.             else
  344.               GTPos := abufFindSubStrEndSkipQuoted('>',addr(ABuffer),ASize,LTPos+1);
  345.             //GT not found
  346.             if GTPos<0 then
  347.               exit;
  348.             _ReportTag(ABuffer,LTpos,GTPos);
  349.           end
  350.         else
  351.           begin
  352. {!}{IBA}(*
  353.             //search "<"
  354.             if SameText(LastTagName,'script') then
  355.               begin
  356.                 LTPos := abufFindSubStr('</script',addr(ABuffer),ASize,GTPos+1);
  357.                 //</script> not found
  358.                 if LTPos<0 then
  359.                   exit;
  360.               end
  361.             else if SameText(LastTagName,'style') then
  362.               begin
  363.                 LTPos := abufFindSubStr('</style',addr(ABuffer),ASize,GTPos+1);
  364.                 //</style> not found
  365.                 if LTPos<0 then
  366.                   exit;
  367.               end
  368.             else
  369. *)
  370.               begin
  371.                 LTPos := aBufFindSubStr('<',addr(ABuffer),ASize,GTPos+1);
  372.                 // "<" not Found
  373.                 if LTPos<0 then
  374.                   begin
  375.                     LTPos := ASize;
  376.                     _ReportText(ABuffer,LTPos,GTPos);
  377.                     exit;
  378.                   end;
  379.               end;
  380.             _ReportText(ABuffer,LTPos,GTPos);
  381.           end;
  382.       until FALSE;
  383.     end;
  384.  
  385.   //------------+---------------------------------------------------------------
  386.     function    TMarkupLanguageParser.Parse
  387.                 (const HTML:ANSIString): boolean;
  388.   //------------+---------------------------------------------------------------
  389.     begin
  390.       Result := FALSE;
  391.       if HTML<>sz then
  392.         Result := Parse(HTML[1],length(HTML));
  393.     end;
  394.  
  395.   //------------+---------------------------------------------------------------
  396.     function    TMarkupLanguageParser.Parse
  397.                 (HTML:TStream): boolean;
  398.   //------------+---------------------------------------------------------------
  399.     var
  400.       Buf: ANSIString;
  401.     begin
  402.       Result := FALSE;
  403.       if HTML.Size<=0 then
  404.         exit;
  405.       Setlength(Buf,HTML.Size);
  406.       HTML.ReadBuffer(Buf[1],length(Buf));
  407.       Result := Parse(Buf[1],length(Buf));
  408.     end;
  409.  
  410.  

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:xmldokument problem
« Odpověď #14 kdy: 23-11-2017, 15:57:39 »
dík za všetkých

aj za bonbónik
Kód: Delphi [Vybrat]
  1. {!}{???}

Offline Ján Masaryk

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 5
    • Verze Delphi: 2010
Re:xmldokument problem
« Odpověď #15 kdy: 23-11-2017, 17:33:06 »
Keď počujem XML, tak sa mi zježia všetky chlpy na tele :)

Skús superobject viď príloha, alebo si to stiahni z https://github.com/hgourvest/superobject

Primárne je to na prácu s JSON, ale dokáže to parsovať XML.
Skúsil som to a keď som videl výsledok, skoro som sa rozplakal od zlosti, ako komplikovane som robil parsery.

Malá ukážka kódu

Kód: Delphi [Vybrat]
  1.  
  2. // NACITANIE SUBORU
  3. cXML := XMLParseFile('161112202.xml', true);
  4.  
  5. // PRECITANIE POPISU 18. POLOZKY SUBORU
  6. cPopis := cXML.S['zbozi[18].popis'];
  7.  
  8.  

Doporučujem minimálne vyskúšať.




Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:xmldokument problem
« Odpověď #16 kdy: 27-11-2017, 02:49:07 »
no kuknem, ale ako je to z rýchlosťou? (oproti DOM, SAX či xtr transformacie?)

Offline František

  • Hrdina
  • ****
  • Příspěvků: 295
  • Karma: 3
    • Verze Delphi: primárne v XE5, občaas 10.1 starter, XE, BDS2006
Re:xmldokument problem
« Odpověď #17 kdy: 27-11-2017, 08:43:40 »
alebo to najrýchlejšie prebehnem s pos()?

Offline Ján Masaryk

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 5
    • Verze Delphi: 2010
Re:xmldokument problem
« Odpověď #18 kdy: 27-11-2017, 10:02:11 »
V demos si skompiluj VirtualTreeView v Options si zaškrtni PACK XML a skús otvoriť nejaké xml.

Skúšal som to na 37MB XML - soedit ho zobrazil za cca 7 sekúnd. V čase bolo aj načítanie do TreeView
Neskúšal merať čas na XMLParseFile(), to si môžeš vyskúšať sám.

Páči sa mi na tom to, že pristupuješ priamo ku konkrétnej položke XML
Vlastne to simuluje, že XML nie je XML ale JSON  ;)

napr.

Kód: Delphi [Vybrat]
  1. cPopis := cXML.S['zbozi[18].popis'];
  2.  
  3. // priamo
  4. dTerminOd := StrToDate(cXML.S['Zajezd[0].Terminy.Termin[0].DatumOd']);
  5.  
  6. // alebo v Cykle
  7. dTerminOd := StrToDate(cXML.S['Zajezd[' + IntToStr(nI) + '].Terminy.Termin['+ IntToStr(nJ) +'].DatumOd']);
  8.  

Nemám to podrobne preskúmané, lebo to momentálne používam na jednoduchšie XML-ká.

Na rozdiel od JSON-u sú všetky hodnoty String a teda musíš robiť konverziu..

Ešte jedna dôležitá poznámka - XML musí byť utf-8.
« Poslední změna: 27-11-2017, 10:04:55 od Ján Masaryk »

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: