XML-Namespaces und XPath

8

Ich habe eine Anwendung, die abhängig von XPath XML-Dokumente und Ausgabeknoten laden muss.

Angenommen, ich beginne mit einem Dokument wie diesem:

%Vor%

Mit XPath //bbb

Bisher ist alles schön.

Und die Auswahl doc.SelectNodes("//bbb"); gibt die Liste der erforderlichen Knoten zurück.

Dann lädt jemand ein Dokument mit einem Knoten wie <myfancynamespace:foo/> und zusätzlichem Namespace in das root-Tag, und alles bricht ab.

Warum? //bbb macht sich nichts aus myfancynamespace , theoretisch sollte es sogar mit //myfancynamespace:foo gut sein, da es keine Mehrdeutigkeit gibt, aber der Ausdruck gibt 0 Ergebnisse zurück und das war's.

Gibt es eine Problemumgehung für dieses Verhalten?

Ich habe einen Namespace-Manager für das Dokument, und ich übergebe es an die Xpath-Abfrage. Aber die Namespaces und die Präfixe sind mir unbekannt, deshalb kann ich sie nicht vor der Abfrage hinzufügen.

Muss ich das Dokument vorab analysieren, um den Namespace-Manager zu füllen, bevor ich eine Auswahl treffe? Warum in aller Welt macht ein solches Verhalten keinen Sinn.

BEARBEITEN:

Ich benutze: XmlDocument und XmlNamespaceManager

EDIT2:

%Vor%

EDIT3: Fand einen Artikel, der das tatsächliche Szenario des Problems mit einer Problemumgehung beschreibt, aber keine sehr schöne Problemumgehung: Ссылка

Fast scheint, dass das Entfernen der xmlns der Weg zu gehen ist ...

    
Coder 18.04.2011, 12:08
quelle

4 Antworten

12

Sie vermissen den ganzen Punkt der XML-Namespaces.

Aber wenn Sie wirklich XPath für Dokumente ausführen müssen, die einen unbekannten Namespace verwenden, und Sie sich wirklich nicht darum kümmern, müssen Sie es entfernen und das Dokument neu laden. XPath funktioniert nicht namespace-agnostisch, es sei denn, Sie möchten die Funktion local-name() an jedem Punkt in Ihren Selektoren verwenden.

%Vor%     
harpo 18.04.2011, 12:18
quelle
6

<myfancynamespace:foo/> ist nicht unbedingt dasselbe wie <foo/> .

Namespaces sind wichtig. Aber ich kann Ihre Frustration verstehen, da sie normalerweise dazu neigen, Codes zu brechen, da verschiedene Implementierungen (C #, Java, ...) dazu neigen, sie auszugeben anders.

Ich schlage vor, dass Sie Ihren XPath so ändern, dass alle Namespaces akzeptiert werden. Zum Beispiel statt

%Vor%

Definieren Sie es als

%Vor%

Das sollte sich darum kümmern.

    
Aliostad 18.04.2011 12:17
quelle
0

Sie sollten etwas genauer beschreiben, was Sie tun möchten. Wie du deine Frage stellst, ergibt keinen Sinn. Der Namespace ist nur ein Teil des Namens. Nicht mehr, nicht weniger. Ihre Frage ist also die gleiche wie die Frage nach einer XPath-Abfrage, um alle Tags mit "x" enden zu lassen. Das ist nicht die Idee hinter XML, aber wenn Sie seltsame Gründe dafür haben: Fühlen Sie sich frei, über alle Knoten zu iterieren und sie selbst zu implementieren. Dasselbe gilt für die Funktionalität, die Sie anfordern.

    
Achim 18.04.2011 12:12
quelle
0

Sie können die LINQ-XML-Klassen wie XDocument verwenden . Sie vereinfachen das Arbeiten mit Namespaces erheblich.

    
Daniel Hilgarth 18.04.2011 12:14
quelle

Tags und Links