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: ところで、この記事「Delphi で NativeXML を使用して、XML ドキュメント内の同様のノードを反復処理するにはどうすればよいですか?」という記事を見てきましたが、最初に提案された解決策 (私のサンプルに似ています) は機能しません。 . 2 つ目は、避けたいノードのリストを使用することを意味します。

4

1 に答える 1