使用 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.*"List
Arrays
语句,以使用接口功能或创建对象,如相应的示例所示。
研究以下 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; } }