2010-12-24 21 views
7

Teniendo en cuenta un documento XML que tiene el siguiente aspecto:recuperar el valor del nodo XML y atributo de nodo utilizando XPath en JAXP

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
<properties> 
    <entry key="agentType">STANDARD</entry> 
    <entry key="DestinationTransferStates"></entry> 
    <entry key="AgentStatusPublishRate">300</entry> 
    <entry key="agentVersion">f000-703-GM2-20101109-1550</entry> 
    <entry key="CommandTimeUTC">2010-12-24T02:25:43Z</entry> 
    <entry key="PublishTimeUTC">2010-12-24T02:26:09Z</entry> 
    <entry key="queueManager">AGENTQMGR</entry> 
</properties> 

Quiero imprimir los valores del atributo "clave" y el elemento de lo que parece de esta manera:

agentType = STANDARD 
DestinationTransferStates = 
AgentStatusPublishRate = 300 
agentVersion = f000-703-GM2-20101109-1550 
CommandTimeUTC = 2010-12-24T02:25:43Z 
PublishTimeUTC = 2010-12-24T02:26:09Z 
queueManager = AGENTQMGR 

soy capaz de imprimir los valores de los nodos sin ningún problema usando este código:

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
XPathExpression expr = xpath.compile("//properties/entry/text()"); 

Object result = expr.evaluate(doc, XPathConstants.NODESET); 
NodeList nodes = (NodeList) result; 
for (int i = 0; i < nodes.getLength(); i++) { 
    System.out.println(nodes.item(i).getNodeValue()); 
} 

Y puedo imprimir los valores del atributo "clave" al cambiar la expresión XPath y los métodos de nodos de la siguiente manera:

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
XPathExpression expr = xpath.compile("//properties/entry"); 
Object result = expr.evaluate(doc, XPathConstants.NODESET); 
NodeList nodes = (NodeList) result; 
for (int i = 0; i < nodes.getLength(); i++) { 
    System.out.println(nodes.item(i).getAttributes().getNamedItem("key").getNodeValue()); 
} 

Parece que habría una manera de conseguir en estos dos valores en una sola evaluate. Siempre pude evaluar dos NodeLists e iterar a través de ellos con un índice común, pero no estoy seguro de que se devuelva en el mismo orden. Cualquier sugerencia apreciada.

+0

Parece que el código xml de jaxp es bastante desordenado, ¿está abierto a otro tipo de apliaciones xml? –

+0

Una vez que obtuve el código JAXP funcionando, lo escribí en XSLT. Eso fue mucho más limpio (se ve como HTML con algunas marcas añadidas) pero tarda para siempre en renderizarse. Voy a probar XSLT con un translet el próximo. Otras sugerencias definitivamente bienvenidas. –

Respuesta

11

¿Qué hay de getTextContent()? Esto debería hacer el trabajo.

Object result = expr.evaluate(doc, XPathConstants.NODESET); 
NodeList nodes = (NodeList) result; 
for (int i = 0; i < nodes.getLength(); i++) 
{ 
    Node currentItem = nodes.item(i); 
    String key = currentItem.getAttributes().getNamedItem("key").getNodeValue(); 
    String value = currentItem.getTextContent(); 

    System.out.printf("%1s = %2s\n", key, value); 
} 

Para más información por favor consulte el Javadoc de getTextContent(). Espero que esto ayude.

+0

copiado, pegado, funcionó perfectamente. ¡Gracias! Voy a echar un vistazo más de cerca a getTextContent(). –

Cuestiones relacionadas