NETCONF Java Toolkit を使用して RPC の返信を解析する
NETCONF サーバーに運用要求または構成要求を送信した後、サーバーは RPC 応答を返します。RPC の返信を解析して目的の情報を抽出するために、いくつかのアプローチを使用できます。
XML rpc_reply = device.executeRPC(“get-chassis-inventory”);
NETCONF Java ツールキットのコンテキスト内で XML 応答を解析する方法は 2 つあります。
オブジェクトを
org.w3c.dom.Document取得し、オブジェクトの標準 Java クラス ライブラリで利用可能なネイティブ解析メソッドをDocument使用します。XML オブジェクトの
findValue(List list)クラスでnet.juniper.netconf.XML利用可能な とfindNodes(List list)メソッドを使用します。
最初のアプローチでは、オブジェクトを getOwnerDocument() 返すために応答オブジェクトのメソッドを Document 呼び出します。
Document doc = rpc_reply.getOwnerDocument();
その後、結果の Document オブジェクトで標準 Java ライブラリでメソッドを使用できます。このメソッドは、標準の Java ライブラリー・メソッドに関して使用できる柔軟性とオプションに役立ちます。
2 つ目のアプローチではnet.juniper.netconf.XML、クラスに、 および findNodes(List list) メソッドが含まれておりfindValue(List list)、XML オブジェクトの解析に使用できます。インターフェイスの機能Listを使用したり、対応する例に示すようにオブジェクトを作成Arraysしたりするには、プログラムコードに"import java.util.*;"ステートメントを含める必要があります。
運用要求に対する次の RPC 応答を get-interface-information 調べること。
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
xmlns:junos="http://xml.juniper.net/junos/11.3I0/junos">
<interface-information>
<physical-interface>
<name>ge-0/0/0</name>
<admin-status>up</admin-status>
<oper-status>up</oper-status>
/* hierarchy truncated for brevity */
</physical-interface>
<physical-interface>
<name>ge-0/0/1</name>
/* hierarchy truncated for brevity */
</physical-interface>
</interface-information>
</rpc-reply>
findValue() を使用したRPC返信の解析
メソッドを findValue() 使用して、階層の任意のレベルで指定された要素の値を決定できます。のRPC応答 get-interface-informationの例では、物理インターフェイスge-0/0/0の要素の値 <admin-status> を決定したいとします。RPC の返信の形式を認識している場合は、次のコードを使用してこの情報を抽出できます。
XML rpc_reply = device.executeRPC(“get-interface-information”);
List<String> list = Arrays.asList("interface-information","physical-interface",
"name~ge-0/0/0", “admin-status");
String admin_status = rpc_reply.findValue(list);
System.out.println(admin_status);
インターフェイス名は、特定の要素を識別するためにチルダ(~)文字を使用があることに注意してください。このコードを実行すると、"up" が標準出力に印刷されます。
findNodes()を使用したRPC返信の解析
メソッドを findNodes() 使用して、特定の階層の下のすべてのノードのリストをオブジェクトとして org.w3c.dom.Node 取得できます。以下のコードスニペットは、 階層の要素の下のすべての <physical-interface> ノードの <interface-information> リストを取得します。
XML rpc_reply = device.executeRPC("get-interface-information");
List<String> list = Arrays.asList("interface-information","physical-interface");
List physical_interfaces_list = rpc_reply.findNodes(list);
ただし、特定のノードを抽出することもできます。次のコードは、ge-0/0/1 インターフェイスのみの階層を返します。
XML rpc_reply = device.executeRPC("get-interface-information");
List<String> list = Arrays.asList("interface-information","physical-interface",
"name~ge-0/0/1");
List physical_interfaces_list = rpc_reply.findNodes(list);
Node ge001_node = (Node)physical_interfaces_list.get(0);
例: findNodes() を使用した RPC リプライの解析(詳細)
次の例では、このアプローチをさらに進め、子ノードを解析して、要素だけのコンテンツを抽出して印刷します <name> 。このサンプル コードは、RPC 応答を解析し、完全なプログラムを表していないプログラム部分に焦点を当てています。
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/* code omitted for brevity */
XML rpc_reply = device.executeRPC("get-interface-information");
// Obtain a list of list of ‘org.w3c.dom.Node’ objects
List<String> list = Arrays.asList("interface-information","physical-interface");
List physical_interfaces_list = rpc_reply.findNodes(list);
// Print the value for each of the name elements:
Iterator iter = physical_interfaces_list.iterator();
while(iter.hasNext()) {
Node node = (Node)iter.next();
NodeList child_nodes_of_phy_interface = node.getChildNodes();
// child_nodes_of_phy_interface contains nodes like <name> and <admin-status>
// Get each <name> node from the NodeList
for (int i = 0; i < child_nodes_of_phy_interface.getLength(); i++) {
Node child_node = child_nodes_of_phy_interface.item(i);
if (child_node.getNodeType() != Node.ELEMENT_NODE){
continue;
}
if (child_node.getNodeName().equals("name")) {
// Print the text value of the <name> node
System.out.println(child_node.getTextContent());
}
break;
}
}