Es gibt ein paar Techniken, die Sie ausprobieren könnten; Was Sie verwenden, hängt davon ab, welche Informationen Sie benötigen, um aus dem Dokument herauszukommen, wie streng Sie sein möchten und wie konform die von Ihnen verwendete XPath-Implementierung ist.
Eine Möglichkeit zum Abrufen des Namespace-URI, der einem bestimmten Präfix zugeordnet ist, ist die namespace::
-Achse. Dadurch erhalten Sie einen Namespace-Knoten, dessen Name das Präfix ist und dessen Wert der Namespace-URI ist. Zum Beispiel könnten Sie den Standard-Namespace-URI auf dem Dokumentelement erhalten den Pfad:
/*/namespace::*[name()='']
Sie könnten in der Lage sein, das verwenden, um die Namespace-Zuordnungen für Ihren XPathNavigator einzurichten. Seien Sie jedoch gewarnt, dass die Achse namespace::
eine der Ecken von XPath 1.0 ist, die nicht immer implementiert ist.
Eine zweite Möglichkeit, diesen Namespace-URI zu erhalten, besteht darin, die namespace-uri()
-Funktion für das Dokumentelement zu verwenden (von dem Sie gesagt haben, dass es immer in diesem Namespace sein wird). Der Ausdruck:
namespace-uri(/*)
wird Ihnen diesen Namespace geben.
Eine Alternative wäre, zu vergessen, ein Präfix mit diesem Namespace zu verknüpfen, und nur Ihren Pfad Namespace-frei machen. Sie können dies tun, indem Sie die Funktion local-name()
immer dann verwenden, wenn Sie auf ein Element verweisen müssen, dessen Namespace Sie nicht kennen.Zum Beispiel:
//*[local-name() = 'Element']
Sie einen Schritt weiter gehen und den Namespace-URI des Elements gegen die des Dokumentelements testen, wenn Sie wirklich wollte:
//*[local-name() = 'Element' and namespace-uri() = namespace-uri(/*)]
Eine letzte Option, da Der Namespace scheint Ihnen nichts zu bedeuten, würde Ihren XML-Code durch einen Filter laufen lassen, der die Namespaces ausblendet. Dann müssen Sie sich in Ihrem XPath überhaupt nicht darum kümmern. Am einfachsten wäre es, das Attribut xmlns
mit einem regulären Ausdruck zu entfernen, aber Sie könnten etwas Komplexeres tun, wenn Sie gleichzeitig andere Aufräumarbeiten durchführen müssen.
Sind diese immer im Standard-Namespace? oder haben Sie jemals: xmlns: myns = "namespace-uri" Auch lesen Sie die Dateien in ihrer Gesamtheit in ein DOM-Dokument oder Parsen mit etwas wie der XmlValidatingReader? – Kev
Sie befinden sich immer im Standardnamespace. Ich lese die Datei noch nicht vollständig, da ich in dieser Sache stecken geblieben bin; Ich denke, dass ich nicht vollständig verstehe, wenn Sie "in ein DOM-Dokument fragen oder mit etwas wie dem XmlValidatingReader analysieren"; Ich würde XPath nur verwenden, um das XML zu lesen, ist es schlecht? –