2013-01-14 13 views
6

I DOM4J für XML Arbeit in Java verwende, ist meine xml wie folgt aus:DOM4J Select (ARG) geben keine Liste der Knoten

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<abcd name="ab.catalog" xmlns="http://www.xyz.com/pqr" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xyz.com/pqr ./abc.xyz.xsd">    
<efg> 
...... 
</efg> 
<efg> 
..... 
</efg> 
</abcd> 

dann,

List<Node>list = document.selectNodes("/abcd/efg"); 

erhält der Größe der Liste Null. Ich denke, dass es auf den Namespace zurückzuführen ist, der in der XML angegeben ist. Ich habe viel versucht, aber keinen Erfolg bekommen.

Antwort

9

Nicht vordefinierte Elementnamen in XPath-Ausdrücken beziehen sich auf Elemente, die sich nicht in einem Namespace befinden. Sie berücksichtigen nicht den im Dokument deklarierten Standardnamen xmlns="...". Sie müssen ein Präfix für den Namespace in der XPath-Engine deklarieren und dann dieses Präfix im Ausdruck verwenden. Hier ist ein Beispiel von the DOM4J javadocs inspiriert:

Map uris = new HashMap(); 
uris.put("pqr", "http://www.xyz.com/pqr"); 
XPath xpath = document.createXPath("/pqr:abcd/pqr:efg"); 
xpath.setNamespaceURIs(uris); 
List<Node> nodes = xpath.selectNodes(document); 
+0

@ Ian: thanxs, es funktioniert, aber ich habe eine Abfrage, wenn ich etwas mehr Knoten oder Knoten haben abzurufen Wert in der Kind-zu-Kind-Knoten, dann habe ich wie oben beschrieben versucht, wie> für (Knoten-Knoten: Knoten) { \t XPath xpath1 = document.createXPath ("// edx: Name/Wert-"); \t xpath1.setNamespaceURIs (uris); \t Knoten nameNode = (Knoten) xpath1.selectSingleNode (Knoten); \t}, aber es gibt nameNode null. wie man es machbar macht wie dom4j. jede Eingabe wird spürbar sein. – user1808932

+0

@ user1808932 '// edx: Name/Wert-' ist ein _absolute_ Pfad, der beginnt, vom Wurzelknoten des Dokuments zu suchen, das 'node' enthält. Wenn Sie "edx: Name" Nachkommen des aktuellen 'node' wollen, dann müssen Sie einen relativen Pfad' .// edx: Name/value-'(mit einem führenden Punkt) verwenden. –

-3

Ändern Sie bitte Ihre Code:

List<Node>list = document.selectNodes("//abcd/efg"); 
+3

das ist nicht wahr. Die '//' -Syntax hat nichts mit Namespaces zu tun –