3

假设我有一个看起来像这样的 XML 文件

<NOTE>
   <TO>
      <CONTACT>
         <NAME>Tove</NAME>
         <EMAIL>tove@home.com</EMAIL>
      </CONTACT>
      <CONTACT>
         <NAME>Biggles</NAME>
         <EMAIL>biggles@home.com</EMAIL>
      </CONTACT>
   </TO>
   <FROM>
      <CONTACT>
         <NAME>Jani</NAME>
         <EMAIL>jani@home.com</EMAIL>
      </CONTACT>
   </FROM>
   <HEADING>Reminder</HEADING>
   <BODY>Party this weekend!</BODY>
</NOTE>

使用 NativeXML(至少在 3.06 版之前)和此代码

procedure TForm1.btnLoad1st2ndClick(Sender: TObject);
// Load an XML document and show the nodes present by enumerating them. Here
// we do only levels 1 and 2. An iterative approach could show all levels deep
var
  i, j: integer;
  NodeLevel1, NodeLevel2: TXmlNode;
begin
  // Clear the memo and create instance
  Memo1.Lines.Clear;
  FXml.Clear;
  // Load the XML file
  FXml.LoadFromFile(edXmlFileOpen.Text);
  // The Root property contains the root node, we use it as a base
  if assigned(FXml.Root) then
  begin
    // Iterate through all the child nodes of Root (level 1)
    for i := 0 to FXml.Root.NodeCount - 1 do
    begin
      NodeLevel1 := FXml.Root.Nodes[i];
      // Add the name of each child to the memo
      Memo1.Lines.Add(string(NodeLevel1.Name));
      // Also iterate through the grandchilds (level 2)
      for j := 0 to NodeLevel1.NodeCount - 1 do
      begin
        NodeLevel2 := NodeLevel1.Nodes[j];
        // Add these names too, with an indent
        Memo1.Lines.Add(' ' + string(NodeLevel2.Name));
      end;
    end;
  end;
end;

我得到这个回应

TO
 CONTACT
 CONTACT
FROM
 CONTACT
HEADING
BODY

这是我所期望的

但现在我在 4.07 版本中使用 NativeXML,并且使用相同的代码,结果是

WhiteSpace
TO
 WhiteSpace
 CONTACT
 WhiteSpace
 CONTACT
 WhiteSpace
WhiteSpace
FROM
 WhiteSpace
 CONTACT
 WhiteSpace
WhiteSpace
HEADING
 CharData
WhiteSpace
BODY
 CharData
WhiteSpace

您猜想在现实生活中,XML 会稍微复杂一些。有没有办法尽可能简单地获得与当前版本的 NativeXML 相同的结果?

谢谢你的帮助

PS:顺便说一下,我看过这篇文章“ How do I iterate through similar nodes in an XML document using NativeXML in Delphi? ”但是第一个建议的解决方案,类似于我的示例,不起作用. 第二个意味着使用节点列表,这是我想避免的。

4

1 回答 1

1

您应该简单地使用xml.root.ElementCountandxml.root.Elements[i]属性而不是NodeCount& Nodes[](与 相同nodelevel1.)来实现所需的输出

于 2013-12-05T13:17:32.150 回答