使用 NETCONF Java 工具包解析 RPC 回复
向 NETCONF 服务器提交操作或配置请求后,服务器会回复 RPC。您可以使用几种方法来解析 RPC 回复,以便提取所需信息。
XML rpc_reply = device.executeRPC(“get-chassis-inventory”);
在 NETCONF Java 工具包上下文中解析 XML 回复的方法有两种:
org.w3c.dom.Document获取对象并使用对象标准 Java 类库中可用的本机解析Document方法。findValue(List list)使用 XMLfindNodes(List list)对象类net.juniper.netconf.XML中可用的 和 方法。
对于第一种方法,调用 getOwnerDocument() 回复对象上的方法以返回 Document 对象。
Document doc = rpc_reply.getOwnerDocument();
然后,可以在生成的对象上的标准 Java 库内使用 Document 方法。此方法对于标准 Java 库方法的灵活性和可用选项非常有用。
对于第二种方法,类net.juniper.netconf.XML包含 findValue(List list) 和 findNodes(List list) 方法,可用于解析 XML 对象。您必须在程序代码中包含"导入 java.util.*"ListArrays语句,以使用接口功能或创建对象,如相应的示例所示。
研究以下 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,假设您希望 <admin-status> 确定物理接口元素的值 ge-0/0/0。由于注意到 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);
请注意,接口名称使用一个 tilde (~) 字符来识别特定元素。执行此代码可打印"最多"到标准输出。
使用 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;
}
}