2013-01-14 9 views
6

używam dom4j do pracy XML w Javie, mój xml jest tak:dom4j selectNodes (arg) nie dają listę węzłów

<?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> 

wtedy,

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

dostaje rozmiar listy zero. Czuję, że wynika to z przestrzeni nazw określonej w xml. Próbowałem dużo, ale nie osiągnąłem sukcesu.

Odpowiedz

9

Niepoprawione nazwy elementów w wyrażeniach XPath odnoszą się do elementów, które nie znajdują się w obszarze nazw - nie uwzględniają "domyślnej" przestrzeni nazw zadeklarowanej w dokumencie na poziomie xmlns="...". Musisz zadeklarować prefiks dla przestrzeni nazw w silniku XPath, a następnie użyć tego przedrostka w wyrażeniu. Oto przykład zainspirowane the DOM4J javadocs:

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, to działa, ale muszę zapytać, czy mam pobrać trochę więcej węzła lub węzła wartość w dziecko do węzła podrzędnego, a następnie próbowałem, jak to samo określone powyżej, jak> dla (węzeł węzła: węzły) { \t XPath xpath1 = document.createXPath ("// edx: nazwa/wartość-"); \t xpath1.setNamespaceURIs (uris); \t Węzeł nazwaNode = (węzeł) xpath1.selectSingleNode (węzeł); \t} ale daje on nazwęNode null. jak sprawić, by działało jak dom4j. wszelkie dane wejściowe będą znaczące. – user1808932

+0

@ user1808932 '// edx: Nazwa/wartość-' to ścieżka _absolute_, która rozpocznie wyszukiwanie od węzła głównego dokumentu zawierającego 'węzeł'. Jeśli chcesz 'edx: Name' potomków bieżącego' węzła', musisz użyć względnej ścieżki '.// edx: Name/value-' (z wiodącą kropką). –

-3

zmodyfikować kod:

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

to nie jest prawda. składnia '//' nie ma nic wspólnego z przestrzeniami nazw –

Powiązane problemy