Mein Ziel ist es, bestimmte Knoten mit XPath aus mehreren XML-Dateien mit mehreren Namespaces zu extrahieren. Alles funktioniert gut, solange ich die Namespace-URIs kenne. Der Namespace-Name selbst bleibt konstant, aber die Schemas (XSD) werden manchmal vom Client generiert, dh mir unbekannt. Dann habe ich grundsätzlich drei Möglichkeiten:
Verwenden Sie nur ein Schema für den Namespace und hoffen Sie, dass nichts schief geht (kann ich sicher sein?)
Holen Sie sich die untergeordneten Knoten des Dokuments und suchen Sie nach dem ersten Knoten mit einem Namespace-URI. Hoffen Sie, dass er dort ist, und verwenden Sie einfach den URI, in der Hoffnung, dass er der richtige ist. kann aus mehreren Gründen schief gehen
Sag xpath irgendwie: "Schau, ich kümmere mich nicht um die Namespaces, finde einfach ALLE Knoten mit diesem Namen, ich kann dir sogar den Namen des Namespace sagen, nur nicht den URI". Und das ist die Frage hier ...
Dies ist keine Wiederholung zahlreicher Fragen, die hier oder hier zu finden sind: "Mein xpath-Ausdruck funktioniert nicht, weil mir die Namespace-Erkennung nicht bekannt ist ." Ich weiß, wie man Namespace-Awareness einsetzt. Nur nicht, wie man es loswird.
quelle
Antworten:
Sie können die
local-name()
XPath-Funktion verwenden. Anstatt einen Knoten wie auszuwählenSie können alle Knoten auswählen und nach dem mit dem richtigen lokalen Namen filtern:
quelle
local-name()
, um auf Attribute zu verweisen, ohne den Namespace zu kennen, siehe: stackoverflow.com/q/21239181/274677Sie können dasselbe in XPath2.0 in einer weniger ausführlichen Syntax tun :
quelle
Sie können Namespace = false für einen XmlTextReader verwenden
mit:
quelle
'The 'xmlns' attribute is bound to the reserved namespace
Fehlers nicht speichern .Oder Sie können name () verwenden:
Oder nur Suchattribute:
Wenn Sie die XML-Datei als Powershell-Objekt öffnen, werden die Namespaces ignoriert:
quelle
Es ist mein Beispiel in Qt C ++. Qt unterstützt XPath 2.0:
Programmausgabe:
"1 0 0 2 0 1 0 0 2 1 0 3 3 0 4 2 0 5\n"
Plane.dae
quelle