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 ...
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.
<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.
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.
Sie können die LINQ-XML-Klassen wie XDocument
verwenden . Sie vereinfachen das Arbeiten mit Namespaces erheblich.