2017-10-27 7 views
2

Ich habe folgende xml:Warum funktioniert mein xpath nicht?

<?xml version="1.0" encoding="UTF-8"?> 
<prefix:someName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:prefix="someUri" xsi:schemaLocation="someLocation.xsd"> 
     <prefix:someName2> 
      .... 
     </prefix:someName2> 
    </prefix:someName> 

Und mein Code sieht wie folgt aus:

private Node doXpathThingy(Document doc) { 
    final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setNamespaceAware(true); 

    XPath xPath = XPathFactory.newInstance().newXPath(); 

    xPath.setNamespaceContext(new NamespaceContext(){ 
     @Override 
     public String getNamespaceURI(String prefix) { 
      if (prefix == null) { 
       throw new NullPointerException("Null prefix"); 
      } 

      return doc.lookupNamespaceURI(prefix); 
     } 

     @Override 
     public String getPrefix(String namespaceURI) { 
      return null; 
     } 

     @Override 
     public Iterator getPrefixes(String namespaceURI) { 
      return null; 
     } 
    }); 

    try { 
     XPathExpression expr = xPath.compile(xpathString); 
     return (Node)expr.evaluate(doc, XPathConstants.NODESET); 
    } catch (Exception e) { 
     ....  } 
} 

Ich versuche, dies mit jeder gültigen XPath zur Arbeit zu kommen. Es arbeitet mit dieser XPaths:

: "" "Präfix somename"

Aber NICHT mit: "prefix: someName2". Es gibt null zurück.

Ich denke, ich bekomme immer noch nichts über Namespaces, aber ich verstehe nicht was? Ich habe versucht, die Präfixe von meinem XPath wegzulassen, aber dann funktioniert überhaupt nichts. Ich habe auch überprüft, ob die richtige URL für das Präfix doc.lookupNamespaceURI (Präfix) zurückgegeben wird, und es ist.

Jede Hilfe würde sehr geschätzt werden.

Antwort

2

Die Abfrage prefix:XXX bedeutet child::prefix:XXX, das heißt, suchen Sie ein Element Kind des Context-Knoten, dessen Name prefix:XXX ist. Ihr Kontextknoten ist der Dokumentknoten im Stammverzeichnis der Struktur. Der Dokumentknoten hat ein Kind mit dem Namen prefix:someName, aber kein Kind mit dem Namen prefix:someName2. Wenn Sie ein Enkelkind des Dokumentknotens finden möchten, versuchen Sie die Abfrage */prefix:someName2.

+0

Vielen Dank für Ihre ausführliche Erklärung. Mein Problem wurde gelöst. :) –

2

Ich kann nicht sagen, dass ich mit der Java-Art der Ausführung von XPath vertraut bin, aber es sieht so aus, als würden Sie eine XPath-Abfrage aus dem Stamm des Dokuments erstellen. Sie sehen also das erwartete Verhalten.

Versuchen Sie, diese someName2 überall in der doc

//prefix:someName2

oder diese zu finden, sie als Kind someName2

/prefix:someName/prefix:someName2

oder diese zu finden, sie als direkte Kind zu finden von jedem Wurzelelement

+0

Vielen Dank, das funktioniert! Ich dachte, dass etwas mit meinem Code nicht in Ordnung wäre, obwohl es in Wirklichkeit mein Mangel an Wissen über die XPath-Syntax war. –