xml - 如何读取childnode的xml子节点

标签 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> 时遇到问题,我想得到像“pomnilnik:7GB”或“Trdi disk:700GB”这样的结果。

如果我使用此代码:

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;

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

最佳答案

您必须循环遍历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;

关于xml - 如何读取childnode的xml子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23403351/

相关文章:

php - 使用 JSON 的实时搜索功能

css - codeception 无法点击 xpath,因为它无法定位 CSS 或 Xpath

c# - 转义 xml 中的特殊字符

windows - 使用 Indy 组件发送电子邮件

Delphi JEDI JCL 在安装时崩溃 Windows 7

Delphi - 使用 TApplicationEvents OnShortCut 事件检测 Alt+C 按键

java - 对合并的 XML 文件进行编码

xml - 如何在 xslt 中使用 xpath 作为变量?

delphi - TStringGrid 无法显示很长(6K)的字符串

delphi - WPARAM 何时从有签名变为无签名?