delphinativexml多层xml结构



我使用实时流xml结构,我应该检查收到的xml数据以希望选择哪种方式,问题是xml流是多级的,如下所示,所有我的测试都被第一阶段卡住了

服务器响应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>

如何从上到下检查所有xml流并访问我想要的任何级别?。例如,我想访问stream:features级别来检查可用的未来,还想跳到压缩级来检查它。

我使用NativeXML 4.04

如何访问特定节点的子节点列表

有许多方法可以列出特定节点的子节点。在我看来,最简单的方法是通过路径查找节点并迭代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>

相关内容

  • 没有找到相关文章

最新更新