NETCONF Java 툴킷을 사용하여 RPC 응답 구문 분석
NETCONF 서버에 운영 또는 구성 요청을 제출한 후 서버는 RPC 응답으로 응답합니다. 원하는 정보를 추출하기 위해 여러 가지 접근 방식을 사용하여 RPC 응답을 구문 분석할 수 있습니다.
XML rpc_reply = device.executeRPC(“get-chassis-inventory”);
NETCONF Java 툴킷의 컨텍스트 내에서 XML 응답을 구문 분석하는 두 가지 접근 방식이 있습니다.
오브젝트를
org.w3c.dom.Document가져오고 오브젝트에 대한 표준 Java 클래스 라이브러리에서 사용할 수 있는 원시 구문 분석 메소드를Document사용하십시오.XML 객체의
findValue(List list)클래스에서 사용할 수 있는net.juniper.netconf.XML및findNodes(List list)메서드를 사용합니다.
첫 번째 방법의 경우 reply 개체에서 메서드를 호출하여 getOwnerDocument() 개체를 반환합니다 Document .
Document doc = rpc_reply.getOwnerDocument();
그런 다음 결과 Document 오브젝트에서 표준 Java 라이브러리의 메소드를 사용할 수 있습니다. 이 메소드는 표준 Java 라이브러리 메소드의 관점에서 사용할 수 있는 유연성 및 옵션에 유용합니다.
두 번째 방법의 경우 net.juniper.netconf.XML 클래스에는 XML 객체를 구문 분석하는 데 사용할 수 있는 및 findNodes(List list) 메서드가 포함되어 findValue(List list) 있습니다. 해당 예제에 표시된 대로 인터페이스의 기능을 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() 메서드를 사용하여 계층의 모든 수준에서 지정된 요소의 값을 확인할 수 있습니다. 에 대한 get-interface-informationRPC 응답 예에서, 물리적 인터페이스 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 가져올 수 있습니다. 다음 코드 조각은 계층 구조의 요소 아래에 <interface-information> 있는 모든 <physical-interface> 노드의 목록을 가져옵니다.
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;
}
}