Utiliser le kit d’outils Java NETCONF pour analyser une réponse RPC
Après avoir soumis une demande opérationnelle ou de configuration au serveur NETCONF, le serveur répond par une réponse RPC. Vous pouvez utiliser plusieurs approches pour analyser la réponse RPC afin d’extraire les informations souhaitées.
XML rpc_reply = device.executeRPC(“get-chassis-inventory”);
Il existe deux approches pour analyser une réponse XML dans le contexte de la boîte à outils Java NETCONF :
Obtenez l’objet et utilisez les méthodes d’analyse
org.w3c.dom.Document
natives disponibles dans les bibliothèques de classes Java standard pour unDocument
objet.Utilisez les
findValue(List list)
méthodes andfindNodes(List list)
disponibles dans lanet.juniper.netconf.XML
classe sur l’objet XML.
Pour la première approche, appelez la getOwnerDocument()
méthode sur l’objet reply pour renvoyer l’objet Document
.
Document doc = rpc_reply.getOwnerDocument();
Vous pouvez ensuite utiliser des méthodes dans les bibliothèques Java standard sur l’objet résultant Document
. Cette méthode est utile pour la flexibilité et les options disponibles en termes de méthodes de bibliothèque Java standard.
Pour la deuxième approche, la net.juniper.netconf.XML
classe contient les findValue(List list)
méthodes et findNodes(List list)
, que vous pouvez utiliser pour analyser l’objet XML. Vous devez inclure l’instruction « import java.util.* ; » dans le code de votre programme pour utiliser les fonctionnalités de l’interface List
ou pour créer un Arrays
objet comme indiqué dans les exemples correspondants.
Étudiez la réponse RPC suivante pour la get-interface-information
demande opérationnelle :
<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>
Analyse d’une réponse RPC à l’aide de findValue()
Vous pouvez utiliser la méthode pour déterminer la valeur d’un élément donné à n’importe quel niveau de la findValue()
hiérarchie. Dans l’exemple de réponse RPC pour get-interface-information
, supposons que vous souhaitiez déterminer la valeur de l’élément de l’interface <admin-status>
physique ge-0/0/0. Étant conscient du format de la réponse RPC, vous pouvez extraire ces informations à l’aide du code suivant :
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);
Notez que le nom de l’interface utilise un caractère tilde (~) pour identifier l’élément particulier. L’exécution de ce code imprime « up » à la sortie standard.
Analyse d’une réponse RPC à l’aide de findNodes()
Vous pouvez utiliser la méthode pour obtenir la findNodes()
liste de tous les nœuds d’une hiérarchie donnée en tant qu’objets org.w3c.dom.Node
. L’extrait de code suivant obtient une liste de tous les <physical-interface>
nœuds sous l’élément <interface-information>
dans la hiérarchie :
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);
Toutefois, vous souhaiterez peut-être extraire un nœud spécifique. Le code suivant renvoie la hiérarchie pour l’interface ge-0/0/1 uniquement :
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);
Exemple : analyse d’une réponse RPC à l’aide de findNodes() (détaillé)
L’exemple suivant pousse cette approche un peu plus loin et analyse les nœuds enfants pour extraire et imprimer le contenu des éléments uniquement <name>
. Cet exemple de code se concentre sur la partie du programme qui analyse la réponse RPC et ne représente pas un programme complet.
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; } }