PerlクライアントアプリケーションのNETCONFサーバーレスポンスを解析
NETCONF Perl クライアント アプリケーションでは、NETCONF サーバーへの接続を確立した後、クライアント アプリケーションは Perl メソッドを呼び出すことによって 1 つ以上の要求を送信できます。NETCONF サーバーは、要素内の適切な情報を <rpc-reply>
返します。NETCONF サーバーの応答を解析する方法は 2 つあります。
XML::LibXML::D OM の機能を使用する
XML::LibXML::XPATHContext の関数を使用する
Junos OS リリース 16.1 以前は、すべての Junos OS リリースに NETCONF Perl クライアントの新しいリリース依存バージョンが含まれていました。Junos OS リリース 16.1 以降、NETCONF Perl クライアントはリリース非依存で、GitHub および CPAN でホストされ、Junos OS リリースの任意のバージョンを実行するデバイスを管理できます。NETCONF Perl クライアントのリリース非依存バージョンには、クライアントの Net::Netconf::Transform
リリース依存バージョンに存在していたモジュールは含まれません。
例えば、NETCONF サーバーからの以下の応答を考えてみましょう。
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:junos="http://xml.juniper.net/junos/16.1R1/junos" message-id='3'> <chassis-inventory xmlns="http://xml.juniper.net/junos/16.1R1/junos-chassis"> <chassis style="inventory"> <name>Chassis</name> <serial-number>G1234</serial-number> <description>MX80-48T</description> ... </chassis> </chassis-inventory> </rpc-reply>
ユーザーが応答を解析し、要素の <serial-number>
値を取得したいとします。
次のコードは、値を取得するために使用 XML::LibXMl::DOM
します。この例では、応答を変数に格納し、 の DOM
メソッドを呼び出して応答を解析します。
my $query = "get_chassis_inventory"; my $res = $jnx->$query(); my $rpc = $jnx->get_dom(); my $serial = $rpc->getElementsByTagName("serial-number")->item(0)->getFirstChild->getData; print ("\nserial number: $serial");
次のコードは、値を取得するために使用 XML::LibXML::XPATHContext
します。この例では、変数に応答を格納し、メソッドを呼び出 XPathContext
して値を取得します。この関数は local-name()
、名前空間のない要素名を返します。XPATH 式は、読みやすくするために複数行に表示されます。
my $query = "get_chassis_inventory"; my $res = $jnx->$query(); my $rpc= $jnx->get_dom(); my $xpc = XML::LibXML::XPathContext->new($rpc); my $serial=$xpc->findvalue(' /*[local-name()="rpc-reply"] /*[local-name()="chassis-inventory"] /*[local-name()="chassis"] /*[local-name()="serial-number"]'); print ("\nserial number: $serial");