2015-10-28 12 views
5

Dato il seguente XML (esempio):Individuazione elemento XML in qualsiasi parte del documento con 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> 

ho bisogno di ottenere i valori di Variant e Version. Il mio approccio attuale sta usando XPath perché non posso contare sulla struttura data. Tutto quello che so è che c'è un elemento rsb:Version da qualche parte nel documento.

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); 

Questo tuttavia non produce nulla. Ho provato le seguenti espressioni XPath:

  • // Variante
  • // Variante/text()
  • // RSB: Variante
  • // RSB: Variante/text()

Qual è l'espressione XPath corretta? O c'è un modo ancora più semplice per arrivare a questo elemento?

+1

XPathFactory deve essere creato con un NamespaceContext. Una volta capito, l'XPath "• // rsb: Variant' dovrebbe funzionare. – JerryM

+0

si prega di vedere anche questa domanda. https://stackoverflow.com/questions/2811001/how-to-read-xml-using-xpath-in-java –

+0

Il commento di @JerryM risolve la mia domanda. –

risposta

3

vorrei suggerire semplicemente scorrendo il documento per trovare il tag dato

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()); 
     } 
    } 
} 

Edit: Yassin ha sottolineato che non otterrà nodi figli. Questo dovrebbe indirizzarti nella giusta direzione per ottenere i bambini.

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

Non dovrebbe essere rsb: VersionInfo? –

+0

Grazie, @ michael-quatrani. La tua risposta è molto utile e ho implementato il tuo meccanismo per altri metodi. Tuttavia ho scelto un altro commento come la mia risposta preferita. –

+0

@Robert nessun problema! Sono contento che tu l'abbia risolto. –

Problemi correlati