1

私はライブ ストリームの 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を使用しています

4

1 に答える 1

2

特定のノードの子ノードのリストにアクセスする方法は?

特定のノードの子ノードを一覧表示するには、さまざまな方法があります。最も簡単なのは、パスでノードを見つけて、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>
于 2012-10-13T19:52:18.150 に答える