如何访问子节点列表中某个特定节点?
有许多方法可以列出特定节点的子节点。最简单的一个在我看来,通过路径找到节点并遍历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;
以上选项不是唯一的方式去子节点,但他们应该是至少作为一个起点。你没有描述你将如何处理这个响应文件,所以很难建议什么可能是最适合你的方法(如果选择一个节点迭代或使用路径选择)。我已经用于测试
你的原始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>
我没有解决你的问题,但我会建议使用现有的XMPP库,而不是彻底改造车轮。一个很棒的Delphi图书馆是Jopl => http://code.google.com/p/exodus/ – Alex