2011-01-14 2 views
16

Così ho un documento XML che ho dichiarato qui:Trova elementi in un nodo senza la corretta namespace, in Java

DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder(); 
StringReader reader = new StringReader(s); 
InputSource inputSource = new InputSource(reader); 
doc_ = dBuilder.parse(inputSource); 

Poi ho una funzione in cui passo in una stringa e voglio corrispondere a quello di un elemento a mio xml:

void foo(String str) 
{ 
    NodeList nodelist = doc_.getDocumentElement().getElementsByTagName(str); 
} 

il problema è quando il str arriva in esso non ha alcun tipo di spazio dei nomi in modo che il xml che sarei stato il test potrebbe essere:

<Random> 
    <tns:node /> 
</Random> 

e il str sarà nodo. Quindi nodelist ora è nullo perché prevede tns: node ma ho passato nel nodo. E so che non è bello ignorare lo spazio dei nomi, ma in questo caso va bene. Il mio problema è che non so come cercare il Nodo per un elemento ignorando lo spazio dei nomi. Ho anche pensato di aggiungere lo spazio dei nomi allo str che arriva ma non ho idea di come farlo.

Qualsiasi aiuto sarebbe molto apprezzato,

Grazie, -Josh

risposta

26

Al fine di corrispondere tutti i nodi il cui nome è 'str' indipendentemente dal namespace utilizzare quanto segue:

NodeList nodes = doc.getDocumentElement().getElementsByTagNameNS("*", str); 

Il carattere jolly "*" corrisponderà a qualsiasi spazio dei nomi. Vedi Element.getElementsByTagNameNS(...).

Edit: in aggiunta, come @Wheezil correttamente dichiarato in un commento, devi chiamare DocumentBuilderFactory.setNamespaceAware(true) per far funzionare tutto questo, altrimenti non verranno rilevati gli spazi dei nomi.

+0

Grazie mille per un'altra fantastica risposta RD01. – Grammin

+0

@gramm nessun problema :) –

+2

Sembra funzionare solo per gli oggetti "DocumentBuilderFactory'" namespace-aware ", poiché gli elementi creati dal livello 1 di DOM non hanno un' localName' ... –

2

La soluzione più semplice è quella di aggiungere il proprio nodo radice tramite manipolazione di stringa

DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder(); 
s = "<root xmlns:tns=\"MyNamespace\">" + s + "</root>"; 
StringReader reader = new StringReader(s); 
InputSource inputSource = new InputSource(reader); 
doc_ = dBuilder.parse(inputSource); 
+0

La stringa ha già uno spazio dei nomi, ho bisogno che la stringa che aggiungo al metodo abbia bisogno di riconoscere tale spazio dei nomi. – Grammin

+0

Potresti pubblicare un esempio minimale dell'intero xml che stai tentando di elaborare. L'xml di esempio che hai pubblicato utilizza un namespace che non è dichiarato da nessuna parte. Il namespace tns deve essere mappato su un URL affinché il documento XML sia ben formato (vedere http://en.wikipedia.org/wiki/XML_namespace#Namespace_declaration). –

+0

Grazie per aver cercato di aiutare +1 ma la risposta di RD01 era ciò che stavo cercando. – Grammin