读取xml的所有节点

时间:2013-06-07 09:36:17

标签: xml delphi for-loop

我有一个像这样的xml

<?xml version="1.0" encoding="UTF-8"?>
    <receipt>
        <item></item>
        <vat></vat>
        <body>
        <details>
            <description>a</description>
            <price></price>
        </details>
        <details>
            <description>b</description>
            <price></price>
        </details>
        </body>
    </receipt>

其中详细描述收据的单行。

我需要阅读所有细节。

我尝试使用此代码:

EntryNode := xmldocument1.DocumentElement.ChildNodes['details'];
for i := 0 to EntryNode.ChildNodes.Count do 
begin
  text := EntryNode.ChildNodes[i];
  Break;
end;

但我只获得了第一个细节标记。

我该如何编辑我的代码?

2 个答案:

答案 0 :(得分:4)

阅读/导入

   procedure importXml;
    var
      i: Integer;
      TransUnits: IXMLNodeList;
    begin
      ListBox.Clear;
      XMLDocument.LoadFromFile('C:\yourpath\demo.xml');
      if Assigned(XMLDocument) then
      begin
        TransUnits  := XMLDocument.DocumentElement.ChildNodes['file'].ChildNodes['body'].ChildNodes;

        for i := 0 to TransUnits.Count - 1 do
          ListBox.Items.Add(TransUnits[I].Attributes['id'] + ' ' + TransUnits[i].ChildNodes['source'].Text + ' ' + TransUnits[i].ChildNodes['target'].Text );
      end;
      XMLDocument.Active;
    end;

查看我的工作示例代码。

写/导出

procedure WriteExport(Sender: TObject);
var
  source, target: String;
  TargetNode: IXMLNode;
  TransUnits: IXMLNodeList;
begin
  //XMLDocument.Encoding := 'UTF8';
  target := edTarget.Text;
  TransUnits  := XMLDocument.DocumentElement.ChildNodes['file'].ChildNodes['body'].ChildNodes;

  TargetNode := TransUnits[ListBox.ItemIndex].ChildNodes.FindNode('target');

  //if not Assigned(TargetNode) then
  //  TargetNode := XMLDocument.DocumentElement.ChildNodes['file'].ChildNodes['body'].ChildNodes[ListBox.ItemIndex].AddChild('target'); Create

  TargetNode.Text := target;
  XMLDocument.SaveToFile('C:\export\demo.xml');
end;

答案 1 :(得分:3)

您必须循环并检查ChildNodes是否

var
 OuterRoot,EntryNode:IXmlNode;
 i,j:Integer;
begin
OuterRoot := xmldocument1.DocumentElement;
for i := 0 to OuterRoot.ChildNodes.Count -1 do
  begin
    if OuterRoot.ChildNodes[i].NodeName='details' then
      begin
        Memo1.Lines.Add(StringOfChar('-',20));
        Memo1.Lines.Add(OuterRoot.ChildNodes[i].NodeName +':');
        EntryNode := OuterRoot.ChildNodes[i];
        for j := 0 to EntryNode.ChildNodes.Count -1 do
        begin
          Memo1.Lines.Add( EntryNode.ChildNodes[j].NodeName + '-'  + EntryNode.ChildNodes[j].Text);
        end;
      end;
  end;
end;