2013-01-14 5 views
6

Sto usando DOM4J per il lavoro XML in Java, il mio xml è come questo:DOM4J selectNodes (arg) non danno elenco dei nodi

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

poi,

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

ottiene il dimensione della lista zero. Sento che è dovuto allo spazio dei nomi specificato in xml. Ho provato molto ma non ho avuto successo.

risposta

9

I nomi di elementi non prefissati nelle espressioni XPath si riferiscono a elementi che non si trovano in un namespace - non tengono conto dello spazio dei nomi "predefinito" xmlns="..." dichiarato nel documento. È necessario dichiarare un prefisso per lo spazio dei nomi nel motore XPath e quindi utilizzare tale prefisso nell'espressione. Ecco un esempio ispirato 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, funziona, ma ho una domanda se devo recuperare un po 'di nodo o nodo valore il nodo child to child, quindi ho provato come lo stesso specificato sopra come> for (nodo nodo: nodi) { \t XPath xpath1 = document.createXPath ("// edx: Name/value-"); \t xpath1.setNamespaceURIs (uris); \t Nome nodoNodo = (Nodo) xpath1.selectSingleNode (nodo); \t} ma fornisce nameNode null. come renderlo praticabile come dom4j. qualsiasi input sarà apprezzabile. – user1808932

+0

@ user1808932 '// edx: Name/value-' è un percorso _absolute_, che inizierà a cercare dal nodo radice del documento che contiene 'node'. Se vuoi i discendenti 'edx: Name' del corrente' node', allora devi usare un percorso relativo '.// edx: Name/value-' (con un punto iniziale). –

-3

modificare il codice:

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

questo non è vero. la sintassi '//' non ha nulla a che fare con namespace –

Problemi correlati