2016-11-15 9 views
0

私はこのXMLを持っている:このxmlを解析するには?

<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> 

私は彼らのPercent値を抽出するために1でVATノード1を読みしようとしていますが、それは最初のノードを読まずに2番目のノードになります。ここに私のコードは、問題がどこにあるか私にはわからない、次のとおりです。

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; 

私はこのCODEノード値を使用することを考えていますが、私は方法がわかりませんか?

+0

それはそれは* ...せずに2番目のノードに行くこと、ではありません最初のVATノードを読み込みます*両方のノードからのパーセンテージ値を同じ、唯一の 'XReportInfo.PercTvaA'に割り当てているようです。 'for i:= 0にaDoc.Root.NodeCount - 1 do'にブレークポイントを置き、** F8 **でコードを1行ずつ進めて、最初のノードからどのように値を上書きしているかを見てください。 2番目の値からの値。 –

答えて

1

Delphiに付属の「XMLデータバインディングウィザード」を使用してください。 Instructions here

このツールは、ソースファイルを解析するためのユニットを生成します。 このユニットでは、このような簡単なコードは、異なるVAT要素の割合を示します。それは代わりにaNode.NodeCountを使用しなければならないとき

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

XMLデータバインディングウィザードには、Delphiのすべてのエディション(SKU)が含まれているわけではありません。小さなXMLファイルでは、しばしば不慣れです。また、代替案も含める必要があります。 –

2

あなたの第二のループはaDoc.Root.NodeCountを使用しています。 aDoc.Root.NodeCountは2ですが、VATには2つ以上のノードがあり、VATには2番目のノードを超えているため、2番目のループにはPercentの値が1つも表示されません。

より、代わりにこのような何かを試してみてください。また

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; 

:また

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; 

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; 
関連する問題