如何读取childnode的xml子元素

时间:2014-05-01 06:50:26

标签: xml delphi

我需要有关xml文件的帮助:

<xmlData date="11.04.2014 18:59:15">
 <Table>
   <ean>888182228609</ean>
   <ident>YH5G16EA</ident>
   <properties>
     <property title="Pomnilnik">4GB</property>
     <property title="Trdi disk">500GB</property>
     <property title="Optična enota">BREZ</property>
   </properties>
 </Table>
 <Table>
   <ean>888182228609</ean>
   <ident>YH5G16EA</ident>
   <properties>
     <property title="Pomnilnik">5GB</property>
     <property title="Trdi disk">600GB</property>
     <property title="Optična enota">BREZ</property>
   </properties>
 </Table>
 <Table>
   <ean>888182228609</ean>
   <ident>YH5G16EA</ident>
   <properties>
     <property title="Pomnilnik">7GB</property>
     <property title="Trdi disk">700GB</property>
     <property title="Optična enota">BREZ</property>
   </properties>
 </Table>
</xmlData>

我知道如何阅读<ean><ident>,但我在阅读<property>时遇到问题,我希望得到像&#34; pomnilnik:7GB&#34;或者&#34; Trdi磁盘:700GB&#34;。

如果我使用此代码:

procedure TForm1.BitBtn4Click(Sender: TObject);
var
  DOC:IXMLDocument;
  i: Integer;
  OrderChilds, properties_Node: IXMLNode;
begin
  DOC := LoadXMLDocument('c:\temp\diss.xml');
  for i := 0 to DOC.ChildNodes.Nodes['xmlData'].ChildNodes.Count - 1 do
  begin
    OrderChilds := DOC.ChildNodes.Nodes['xmlData'].ChildNodes[i];
    if OrderChilds.NodeName = 'Table' then  
    begin
      properties_Node := OrderChilds.ChildNodes.Nodes['properties'];
      if Assigned(properties_Node) then 
        Memo1.Lines.Add(properties_Node.ChildNodes.Nodes['property'].NodeValue)
    end;
  end;
end;

我只获得每个表中的第一个属性。我想读取第一个表中的所有属性,然后转到下一个表并读取属性等等。

1 个答案:

答案 0 :(得分:2)

您必须遍历properties_Node中的所有子节点。与使用xmlData时的操作相同。

propChildList := properties_Node.ChildNodes;
for j := 0 to propChildList.Count - 1 do begin
    Memo1.Lines.Add(propChildList.Nodes[j].NodeValue);
end;

这是完整的工作示例:

procedure TForm1.Button1Click(Sender: TObject);
var
  DOC:IXMLDocument;
  i, j: Integer;
  OrderChilds, properties_Node: IXMLNode;
  propChildList: IXMLNodeList;
begin
  DOC := LoadXMLDocument('c:\temp\diss.xml');
  for i := 0 to DOC.ChildNodes.Nodes['xmlData'].ChildNodes.Count - 1 do
  begin
    OrderChilds := DOC.ChildNodes.Nodes['xmlData'].ChildNodes[i];
    if OrderChilds.NodeName = 'Table' then
    begin
      properties_Node := OrderChilds.ChildNodes.Nodes['properties'];
      if Assigned(properties_Node) then begin
        propChildList := properties_Node.ChildNodes;
        for j := 0 to propChildList.Count - 1 do begin
          Memo1.Lines.Add(propChildList.Nodes[j].NodeValue);
        end;
      end;
    end;
  end;
end;