Bereinigung der Namespaces mit dom4j

8

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?

    
Antoine Claval 14.09.2009, 15:48
quelle

5 Antworten

5

Ich wollte alle Namespace-Informationen (Deklaration und Tag) entfernen, um die Xpath-Auswertung zu vereinfachen. Ich habe diese Lösung:

%Vor%

wobei der NameSpaceCleaner ein dom4j-Besucher ist:

%Vor%     
mestachs 18.08.2011 12:03
quelle
4

Es folgt ein Code, den ich gefunden habe und jetzt verwende. Es kann nützlich sein, wenn Sie nach einem generischen Weg suchen, alle Namespaces aus einem dom4j-Dokument zu entfernen.

%Vor%

Hoffe, das ist nützlich für jemanden, der es braucht!

    
Abhishek 26.08.2010 08:05
quelle
1

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.

    
Jherico 14.09.2009 16:25
quelle
0

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:

  1. Ich musste tief strukturiertes XML verarbeiten, das den Stapel in die Luft sprengte.
  2. Bei komplexem XML wurde aus einem Grund, den ich nicht vollständig untersucht habe, das Entfernen aller Namespaces nur zuverlässig durchgeführt, wenn zuerst die DOM-Baumtiefe durchlaufen wurde. So dass der Besucher ausgeschlossen wurde, oder die Liste der Knoten mit document.selectNodes("//*") erhalten

Ich endete mit dem Folgenden (nicht das eleganteste, aber wenn das helfen kann, jemandes Problem zu lösen ...):

%Vor%     
vdr 23.03.2013 01:54
quelle
0

Dieser Code funktioniert tatsächlich:

%Vor%     
user2368526 15.11.2014 08:05
quelle

Tags und Links