2011-01-14 10 views
16

So habe ich ein XML-Dokument, das ich hier erklärt habe:Finden Elemente in einem Knoten ohne den richtigen Namensraum, in Java

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

Dann habe ich eine Funktion, wo ich in einem String übergeben, und ich möchte überein, dass ein Element in meinem xml:

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

das Problem ist, wenn die str darin kommt nicht jede Art von Namensraum darin hat, so dass die xml, dass ich Tests wären sei:

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

und der str wird Knoten sein. Also ist nodelist jetzt null, weil es den tns: node erwartet, aber ich habe den Knoten übergeben. Und ich weiß, dass es nicht gut ist, den Namensraum zu ignorieren, aber in diesem Fall ist es in Ordnung. Mein Problem ist, dass ich nicht weiß, wie man den Knoten nach einem Element durchsucht, während ich den Namespace ignoriere. Ich habe auch darüber nachgedacht, den Namespace dem Str hinzuzufügen, der hereinkommt, aber ich habe auch keine Idee, wie ich das machen soll.

Jede Hilfe wäre sehr geschätzt,

Danke, -Josh

Antwort

26

Um hinzuzufügen, alle Knoten entsprechen Wobei der Name 'str' unabhängig vom Namensraum lautet:

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

Der Platzhalter "*" entspricht einem beliebigen Namespace. Siehe Element.getElementsByTagNameNS(...).

bearbeiten: zusätzlich, wie man richtig in einem Kommentar erwähnt @Wheezil, haben Sie DocumentBuilderFactory.setNamespaceAware(true) dafür nennen, zu arbeiten ansonsten Namespaces werden nicht erkannt.

+0

Vielen Dank für eine weitere tolle Antwort RD01. – Grammin

+0

@gramm kein Problem :) –

+2

Das scheint nur für "namespace-aware" "DocumentBuilderFactory" -Objekte zu funktionieren, da DOM Level 1-erstellte Elemente keinen 'localName' haben ... –

2

Die einfachste Lösung ist Ihren eigenen Wurzelknoten über String-Manipulation

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

Die Zeichenfolge hat bereits einen Namespace, ich brauche die Zeichenfolge, die ich der Methode hinzufügen muss, um diesen Namespace zu erkennen. – Grammin

+0

Konnten Sie ein minimales Beispiel des vollständigen xml bekanntgeben, das Sie zu verarbeiten versuchen. Das von Ihnen gepostete Beispiel-XML verwendet einen Namespace, der nirgendwo deklariert ist. Der Namespace tns muss einer URL zugeordnet werden, damit das XML-Dokument korrekt formatiert wird (siehe http://en.wikipedia.org/wiki/XML_namespace#Namespace_declaration). –

+0

Vielen Dank für den Versuch, +1 zu helfen, aber die Antwort von RD01 war, wonach ich gesucht habe. – Grammin