Wir verwenden dom4j 1.6.1, um XML von irgendwoher zu analysieren. Manchmal haben die Balise den Namespace (zB:) und manchmal nicht (). Und es ist ein Aufruf von Element.selectSingleNode (String s) fehlgeschlagen.
Für jetzt haben wir 3 Lösungen, und wir sind nicht glücklich mit ihnen
1 - Entfernen Sie alle Namespacevorkommen, bevor Sie etwas mit dem xml-Dokument tun
%Vor%2 - Entfernen Sie den Namespace, bevor Sie einen Knoten erhalten Durch den Aufruf von
%Vor%Aber es funktioniert nur für einen Knoten und die erste Ebene von Kind
3 - Stören Sie den Code mit
%Vor%Also ... was denkst du? Hexe eins ist die weniger schlimm? Hast du andere Lösung vorzuschlagen?
Option 1 ist gefährlich, weil Sie die Präfixe für einen bestimmten Namespace nicht garantieren können, ohne das Dokument vorher zu analysieren, und weil Sie am Ende mit der Namespace-Kollision enden können. Wenn Sie ein Dokument konsumieren und nichts ausgeben, ist es in Abhängigkeit von der Quelle des Dokuments möglicherweise in Ordnung, aber ansonsten werden nur zu viele Informationen verloren.
Option 2 könnte rekursiv angewendet werden, hat aber viele der gleichen Probleme wie Option 1.
Option 3 klingt nach dem besten Ansatz, aber statt den Code zu überladen, sollten Sie eine statische Methode erstellen, die beide Überprüfungen durchführt, anstatt die gleiche if-Anweisung in Ihre Codebase zu schreiben.
Der beste Ansatz besteht darin, denjenigen zu erreichen, der Ihnen das fehlerhafte XML sendet, um es zu beheben. Natürlich wirft dies die Frage auf, ob es tatsächlich gebrochen ist. Insbesondere erhalten Sie XML, wenn der Standardnamespace als X definiert ist, und dann erhält ein Namespace, der auch X darstellt, das Präfix "es"? Wenn das der Fall ist, dann ist das XML wohlgeformt und Sie brauchen nur Code, der das Präfix nicht versteht, aber immer noch einen qualifizierten Namen verwendet, um das Element zu holen. Ich kenne Dom4j nicht genug, um zu wissen, ob das Erstellen eines Namespace mit einem Null-Präfix dazu führt, dass alle Elemente mit einem passenden URI oder nur denen ohne Präfix übereinstimmen, aber es lohnt sich, damit zu experimentieren.
Als Abhishek musste ich den Namespace von XML streichen, um XPath-Abfragen in Systemtestskripten zu vereinfachen. (das XML wird zuerst XSD validiert)
Hier sind die Probleme, denen ich gegenüberstand:
document.selectNodes("//*")
erhalten
Ich endete mit dem Folgenden (nicht das eleganteste, aber wenn das helfen kann, jemandes Problem zu lösen ...):
%Vor%Tags und Links java namespaces dom4j