2015-10-28 3 views
5

das folgende XML (Beispiel) Gegeben:Auffinden XML-Element überall in dem Dokument mit Java

<?xml version="1.0" encoding="UTF-8"?> 
<rsb:VersionInfo xmlns:atom="http://www.w3.org/2005/Atom" xmlns:rsb="http://ws.rsb.de/v2"> 
    <rsb:Variant>Windows</rsb:Variant> 
    <rsb:Version>10</rsb:Version> 
</rsb:VersionInfo> 

Ich brauche die Werte von Variant und Version zu bekommen. Mein aktueller Ansatz verwendet XPath, da ich mich nicht auf die gegebene Struktur verlassen kann. Ich weiß nur, dass irgendwo im Dokument ein Element rsb:Version steht.

XPath xpath = XPathFactory.newInstance().newXPath(); 
String expression = "//Variant"; 
InputSource inputSource = new InputSource("test.xml"); 
String result = (String) xpath.evaluate(expression, inputSource, XPathConstants.STRING); 
System.out.println(result); 

Dies gibt jedoch nichts aus. Ich habe die folgende XPath-Ausdrücke versucht:

  • // Variant
  • // Variant/text()
  • // RSB: Variant
  • // RSB: Variant/text()

Was ist der korrekte XPath-Ausdruck? Oder gibt es einen noch einfacheren Weg zu diesem Element?

+1

Die XPathFactory muss mit einem NamespaceContext erstellt werden. Sobald Sie das herausgefunden haben, sollte der XPath "• // rsb: Variant" funktionieren. – JerryM

+0

siehe auch diese Frage. https://stackoverflow.com/questions/2811001/how-to-read-xml-using-xpath-in-java –

+0

Der Kommentar von @JerryM löst meine Frage. –

Antwort

3

würde ich vorschlagen, nur durch das Dokument Looping den gegebenen Tag

public static void main(String[] args) throws SAXException, IOException,ParserConfigurationException, TransformerException { 

    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory 
      .newInstance(); 
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
    Document document = docBuilder.parse(new File("test.xml")); 

    NodeList nodeList = document.getElementsByTagName("rsb:VersionInfo"); 
    for (int i = 0; i < nodeList.getLength(); i++) { 
     Node node = nodeList.item(i); 
     if (node.getNodeType() == Node.ELEMENT_NODE) { 
      // do something with the current element 
      System.out.println(node.getNodeName()); 
     } 
    } 
} 

bearbeiten zu finden: Yassin wies darauf hin, dass es nicht untergeordneten Knoten erhalten wird. Dies sollte Sie in die richtige Richtung zeigen, um die Kinder zu bekommen.

private static List<Node> getChildren(Node n) 
    { 
    List<Node> children = asList(n.getChildNodes()); 
    Iterator<Node> it = children.iterator(); 
    while (it.hasNext()) 
     if (it.next().getNodeType() != Node.ELEMENT_NODE) 
     it.remove(); 
    return children; 
    } 
+0

Sollte es nicht rsb sein: VersionInfo? –

+0

Danke, @ michael-quatrani. Ihre Antwort ist sehr hilfreich und ich habe Ihren Mechanismus für andere Methoden implementiert. Jedoch habe ich einen anderen Kommentar als meine bevorzugte Antwort gewählt. –

+0

@Robert kein Problem! Freut mich, dass du es aussortiert hast. –

Verwandte Themen