2012-04-10 4 views
5

ich einen Abschnitt von XML haben, die wie folgt aussieht:, wie ein Knoten Wert in Xpath bekommen - 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> 

Ich brauche den Link http://example.com/projects/example1 aus diesem Block zu greifen. Ich bin mir nicht sicher, wie ich das machen soll. Um den Titel des Projekts zu erhalten verwende ich diesen Code:

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

wo children ist die getChildNodes() Objekt für den <entry> </entry> Block. Aber ich bekomme immer NullPointerExceptions, wenn ich versuche, den Knotenwert für den Knoten <link> in ähnlicher Weise zu erhalten. Ich sehe, dass der XML-Code für den Knoten <link> unterschiedlich ist, und ich bin mir nicht sicher, was es wert ist .... Bitte beraten!

+0

Haben Sie die XPath-Syntax für diese benötigen? Oder benötigen Sie die Java-API-Syntax? –

+1

Ahh, gute Frage, auf der Suche nach der Java-API-Syntax. Aber ich habe es funktioniert, siehe unten. Danke – blaughli

Antwort

13

Der XPath-Ausdruck, dass der Knoten zu erhalten, ist

//entry/link/@href 

in Java Sie

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

Dann, wenn Sie brauchen, um das ändern Sie können link Wert des Eintrags mit einem bestimmten id schreiben der xpath-Ausdruck zu

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

Schließlich wenn Sie alle Links in den Dokumenten bekommen, wenn das Dokument viele Eingabeelemente hat, können Sie schreiben

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

Danke Dash1e, du hast mich in die richtige Richtung geschoben. Mit der von Ihnen angegebenen Syntax konnte ich den kompilierten Xpath-Ausdruck auswerten (die Ergebnisse werden als 'NODESET' zurückgegeben). Ich machte dann eine NodeList aus dem Ergebnis (der NODESET), und dann iterierte ich mit einer while-Schleife, um alle Links von der RSS-Seite zu bekommen, die ich gerade lese. Vielen Dank :). – blaughli

+0

Ich füge der Antwort auch das 'NodeList' Beispiel hinzu. Zur Vollständigkeit. – dash1e

6

die komplette Code:

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

Danke, Phani, genau das habe ich gemacht. – blaughli

Verwandte Themen