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-information
RPC 응답 예에서, 물리적 인터페이스 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; } }