2016-11-15 5 views
0

Ich habe diese XML:Delphi.Wie dieses XML zu analysieren?

<NET_TAX_DATABASE DeviceSerialNo="ATH16000038" CreationDate="15/11/2016 13:21"> 
<VAT> 
<Code>02</Code> 
<Letter>B</Letter> 
<Percent>8%</Percent 
<RcptVATAmount>31,11</RcptVATAmount> 
</VAT> 
<VAT> 
<Code>03</Code> 
<Descr>CATEG. TVA B</Descr> 
<Letter>C</Letter> 
<Percent>11%</Percent> 
<RcptVATAmount>312,11</RcptVATAmount> 
</VAT> 
</NET_TAX_DATABASE> 

Ich versuche, die VAT Knoten eins nach dem anderen zu lesen ihre Percent Werte zu extrahieren, aber es geht an den zweiten Knoten, ohne den ersten Knoten zu lesen. Hier ist mein Code, ich weiß nicht, wo das Problem ist:

var 
    i,j  : Integer; 
    aDoc  : TNativeXml; 
    aNode : TXmlNode; 
begin 
    try 
    aDoc := TNativeXml.Create(nil); 
    aDoc.LoadFromStream(content); 
    aDoc.XmlFormat := xfReadable; 
    if Assigned(aDoc.Root) then 
    begin 
     for i := 0 to aDoc.Root.NodeCount - 1 do 
     begin 
     if (AnsiUpperCase(aDoc.Root.Nodes[i].Name) = AnsiUpperCase('vat')) then 
     begin 
      aNode := aDoc.Root.Nodes[i]; 
      for j := 0 to aDoc.Root.NodeCount - 1 do 
      begin 
      if (aNode[j].Name = 'Percent') then 
      begin 
       str     := aNode[j].ValueUnicode; 
       str     := stringReplace(str, '%','',[rfReplaceAll]); 
       XReportInfo.PercTvaA := StrToInt(trim(str)); 
      end; 
      end; 
     end; 
     end; 
    end; 
    finally 
    aDoc.Free; 
    end; 
end; 

Ich denke diesen Code Knotenwert zu verwenden, aber ich weiß nicht, wie?

+0

Es ist nicht, dass es * ... auf den zweiten Knoten geht ohne Lesen Sie den ersten VAT-Knoten. * Sie scheinen den Prozentwert von beiden Knoten demselben, nur einem, 'XReportInfo.PercTvaA' zuzuweisen. Setzen Sie einen Haltepunkt auf 'für i: = 0 auf aDoc.Root.NodeCount - 1 do' und gehen Sie dann mit ** F8 ** Zeile für Zeile durch den Code und sehen Sie, wie Sie den Wert vom ersten Knoten überschreiben Wert von der Sekunde. –

Antwort

1

Verwenden Sie den XML-Datenbindungsassistenten, der mit Delphi geliefert wird. Instructions here.

Diese Tools generieren eine Einheit zum Parsen der Quelldatei. Mit diesem Gerät erhalten Sie mit einem einfachen Code den Prozentsatz der verschiedenen MwSt-Elemente.

var 
    StockList: IXMLNET_TAX_DATABASEType; 
    vat:IXMLVATType; 
    i:integer; 
begin 
    StockList := LoadNET_TAX_DATABASE('sampleXML.xml'); 
    for I := 0 to (StockList.Count - 1) do begin 
    vat := StockList.VAT[i]; 
    Memo1.Lines.Add(IntToStr(vat.Code) + ' -- ' + vat.Percent); 
    end; 
end; 
+1

Der XML-Datenbindungsassistent ist nicht in allen Editionen (SKUs) von Delphi enthalten, und für kleine XML-Dateien ist es oft übertrieben. Sie sollten auch eine Alternative hinzufügen. –

2

Ihre zweite Schleife verwendet aDoc.Root.NodeCount wenn es aNode.NodeCount stattdessen verwendet werden soll. aDoc.Root.NodeCount ist 2, aber es gibt mehr als 2 Knoten in jedem VAT, und Percent ist jenseits des zweiten Knotens in jedem VAT, so dass Ihre zweite Schleife nie einen der Percent Werte sehen wird.

etwas mehr wie das Versuchen Sie stattdessen:

var 
    i,j : Integer; 
    aDoc : TNativeXml; 
    aNode : TXmlNode; 
begin 
    aDoc := TNativeXml.Create(nil); 
    try 
    aDoc.LoadFromStream(content); 
    aDoc.XmlFormat := xfReadable; 
    if Assigned(aDoc.Root) then 
    begin 
     for i := 0 to aDoc.Root.NodeCount - 1 do 
     begin 
     aNode := aDoc.Root.Nodes[i]; 
     if SameText(aNode.Name, 'VAT') then 
     begin 
      for j := 0 to aNode.NodeCount - 1 do 
      begin 
      if SameText(aNode[j].Name, 'Percent') then 
      begin 
       str := StringReplace(aNode[j].ValueUnicode, '%', '', [rfReplaceAll]); 
       // use str as needed... 
       Break; 
      end; 
      end; 
     end; 
     end; 
    end; 
    finally 
    aDoc.Free; 
    end; 
end; 

Alternativ:

var 
    i,j  : Integer; 
    aDoc  : TNativeXml; 
    aNode, aPercent : TXmlNode; 
begin 
    aDoc := TNativeXml.Create(nil); 
    try 
    aDoc.LoadFromStream(content); 
    aDoc.XmlFormat := xfReadable; 
    if Assigned(aDoc.Root) then 
    begin 
     for i := 0 to aDoc.Root.NodeCount - 1 do 
     begin 
     aNode := aDoc.Root.Nodes[i]; 
     if SameText(aNode.Name, 'VAT') then 
     begin 
      aPercent := aNode.NodeByName('Percent'); 
      if aPercent <> nil then 
      begin 
      str := StringReplace(aPercent.ValueUnicode, '%', '', [rfReplaceAll]); 
      // use str as needed... 
      end; 
     end; 
     end; 
    end; 
    finally 
    aDoc.Free; 
    end; 
end; 

Alternativ:

var 
    i,j  : Integer; 
    aDoc  : TNativeXml; 
    aList : TList; 
    aPercent : TXmlNode; 
begin 
    aDoc := TNativeXml.Create(nil); 
    try 
    aDoc.LoadFromStream(content); 
    aDoc.XmlFormat := xfReadable; 
    if Assigned(aDoc.Root) then 
    begin 
     aList := TList.Create; 
     try 
     aDoc.Root.FindNodes('Percent', aList); 
     for i := 0 to aList.Count - 1 do 
     begin 
      aPercent := TXmlNode(aList[i]); 
      str := StringReplace(aPercent.ValueUnicode, '%', '', [rfReplaceAll]); 
      // use str as needed... 
     end; 
     finally 
     aList.Free; 
     end; 
    end; 
    finally 
    aDoc.Free; 
    end; 
end;