次のような 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 つ目は、避けたいノードのリストを使用することを意味します。