特定のノードの子ノードのリストにアクセスする方法は?
特定のノードの子ノードを一覧表示するには、さまざまな方法があります。最も簡単なのは、パスでノードを見つけて、Containers
インデックス付きプロパティを反復処理することです。/stream:stream/stream:features
次のサンプル コードでは、ノード パスからすべてのノードを反復処理する方法を確認できます。
uses
NativeXml;
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
Node: TXMLNode;
NativeXML: TNativeXML;
begin
NativeXML := TNativeXML.Create(nil);
try
NativeXML.LoadFromFile('c:\Response.xml');
if Assigned(NativeXML.Root) then
begin
Node := NativeXML.Root.FindNode('/stream:stream/stream:features');
if Assigned(Node) then
for I := 0 to Node.ContainerCount - 1 do
ShowMessage(UTF8ToString(Node.Containers[I].Name));
end;
finally
NativeXML.Free;
end;
end;
その名前で特定のノードの子ノードを取得する方法は?
また、XML ノード ツリーをさらに深く掘り下げる方法は複数あります。ノード名がわかっている場合NodeByName
、子ノードが親ツリーのルートで見つかった場合、または見つからなかった場合に子ノードへの参照を返す関数を使用するのが最も簡単ですnil
。次のコード サンプルでは、NodeByName
関数を使用しcompression
て最初にノードを取得し、そこからノードにアクセスmethod
してその値を表示する方法を確認できます。
Node := NativeXML.Root.FindNode('/stream:stream/stream:features');
if Assigned(Node) then
begin
Node := Node.NodeByName('compression');
if Assigned(Node) then
begin
Node := Node.NodeByName('method');
if Assigned(Node) then
ShowMessage(UTF8ToString(Node.Value));
end;
end;
前の例と同じノードに、たとえば次のように直接パスを使用して取得することもできます。
if Assigned(NativeXML.Root) then
begin
Node := NativeXML.Root.FindNode('/stream:stream/stream:features/compression/method');
if Assigned(Node) then
ShowMessage(UTF8ToString(Node.Value));
end;
上記のオプションは、子ノードに到達する唯一の方法ではありませんが、少なくとも開始点としては十分なはずです。その応答ファイルで何をするかを説明していないため、最適な方法を提案するのは困難です (ノード反復の 1 つを選択するか、パス選択を使用する場合)。
テストに使用した元の XML ファイル:
<?xml version='1.0' encoding='UTF-8'?>
<stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="messenger.tashbik.com" id="40d07647" xml:lang="en" version="1.0">
<stream:features>
<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"></starttls>
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
<mechanism>DIGEST-MD5</mechanism>
<mechanism>PLAIN</mechanism>
<mechanism>CRAM-MD5</mechanism>
</mechanisms>
<compression xmlns="http://jabber.org/features/compress">
<method>zlib</method>
</compression>
<auth xmlns="http://jabber.org/features/iq-auth"/>
<register xmlns="http://jabber.org/features/iq-register"/>
</stream:features>