2012-04-10 32 views
5

Tengo una sección de XML que tiene este aspecto:cómo conseguir un valor de nodo en Xpath - Java

<entry> 
<id>tag:example.com,2005:Release/343597</id> 
<published>2012-04-10T11:29:19Z</published> 
<updated>2012-04-10T12:04:41Z</updated> 
<link type="text/html" href="http://example.com/projects/example1" rel="alternate"/> 
<title>example1</title> 
</entry> 

necesito para agarrar el enlace http://example.com/projects/example1 de este bloque. No estoy seguro de cómo hacer esto. Para obtener el título del proyecto que utilizo este código:

String title1 = children.item(9).getFirstChild().getNodeValue(); 

donde children es el objeto getChildNodes() para el bloque <entry> </entry>. Pero sigo recibiendo NullPointerExceptions cuando intento obtener el valor del nodo <link> de una manera similar. Veo que el código XML es diferente para el nodo <link>, y no estoy seguro de cuál es su valor ... ¡Por favor, avise!

+0

¿Necesita la sintaxis XPath para esto? ¿O necesitas la sintaxis de la API de Java? –

+1

Ahh, buena pregunta, buscando la sintaxis de la API de Java. Pero lo tengo funcionando, mira abajo. Gracias – blaughli

Respuesta

13

la expresión XPath para conseguir ese nodo es

//entry/link/@href 

en Java se puede escribir

Document doc = ... // your XML document 
XPathExpression xp = XPathFactory.newInstance().newXPath().compile("//entry/link/@href"); 
String href = xp.evaluate(doc); 

Entonces, si usted necesita para obtener el valor link de la entrada con una específica id puede cambiar la expresión de xpath a

//entry[id='tag:example.com,2005:Release/343597']/link/@href 

Por último, si desea obtener todos los eslabones de los documentos, si el documento tiene muchos elementos de entrada se puede escribir

Document doc = ... // your XML document 
XPathExpression xp = XPathFactory.newInstance().newXPath().compile("//entry/link/@href"); 
NodeList links = (NodeList) xp.evaluate(doc, XPathConstants.NODESET); 
// and iterate on links 
+1

Gracias dash1e, me empujaste en la dirección correcta. Usando la sintaxis que me proporcionó, pude evaluar la expresión compilada de Xpath (devolviendo los resultados como 'NODESET'). Luego hice un NodeList del resultado (el NODESET), y luego repasé con un ciclo while para tomar todos los enlaces de la página RSS que estoy leyendo. Muchas gracias :). – blaughli

+0

Agrego a la respuesta el ejemplo 'NodeList' también. Por completitud. – dash1e

6

Aquí está el código completo:

DocumentBuilderFactory domFactory = DocumentBuilderFactory 
      .newInstance(); 
    domFactory.setNamespaceAware(true); 
    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    Document doc = builder.parse("test.xml"); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
    XPathExpression expr = xpath.compile("//entry/link/@href"); 
    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)); 
    } 
+0

Gracias Phani, eso es exactamente lo que hice. – blaughli

Cuestiones relacionadas