Ich bin mir ziemlich sicher , warum - zumindest im .Net Framework - bei der Ausführung von XPath-Abfragen ein verwendet werden XmlNamespaceManagermuss, um Namespaces (oder das eher klobige und ausführliche [local-name()=...XPath-Prädikat / Funktion / was auch immer) zu verarbeiten . Ich kann verstehen , warum Namespaces sind notwendig oder zumindest vorteilhaft, aber warum ist es so kompliziert?
Um ein einfaches XML-Dokument abzufragen (keine Namespaces) ...
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode>
<nodeName>Some Text Here</nodeName>
</rootNode>
... man kann so etwas verwenden doc.SelectSingleNode("//nodeName")(was passen würde <nodeName>Some Text Here</nodeName>)
Rätsel Nr. 1 : Mein erster Ärger - wenn ich das richtig verstehe - ist, dass ich lediglich einen Namespace-Verweis auf das übergeordnete / Root-Tag hinzufüge (unabhängig davon, ob es als Teil eines untergeordneten Knoten-Tags verwendet wird oder nicht).
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode xmlns="http://example.com/xmlns/foo">
<nodeName>Some Text Here</nodeName>
</rootNode>
... erfordert mehrere zusätzliche Codezeilen, um das gleiche Ergebnis zu erzielen:
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("ab", "http://example.com/xmlns/foo")
Dim desiredNode As XmlNode = doc.SelectSingleNode("//ab:nodeName", nsmgr)
... sich im Wesentlichen ein nicht existierendes Präfix (" ab") ausdenken, um einen Knoten zu finden, der nicht einmal ein Präfix verwendet. Wie macht das Sinn? Was ist (konzeptionell) falsch doc.SelectSingleNode("//nodeName")?
Rätsel Nr. 2 : Angenommen, Sie haben ein XML-Dokument, das Präfixe verwendet:
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode xmlns:cde="http://example.com/xmlns/foo" xmlns:feg="http://example.com/xmlns/bar">
<cde:nodeName>Some Text Here</cde:nodeName>
<feg:nodeName>Some Other Value</feg:nodeName>
<feg:otherName>Yet Another Value</feg:otherName>
</rootNode>
... Wenn ich das richtig verstehe, müssten Sie beide Namespaces zum hinzufügen XmlNamespaceManager, um eine Abfrage für einen einzelnen Knoten durchzuführen ...
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("cde", "http://example.com/xmlns/foo")
nsmgr.AddNamespace("feg", "http://example.com/xmlns/bar")
Dim desiredNode As XmlNode = doc.SelectSingleNode("//feg:nodeName", nsmgr)
... Warum brauche ich in diesem Fall (konzeptionell) einen Namespace-Manager?
****** ANONYMISIERT in Kommentare unten ****
Bearbeiten Hinzugefügt: Meine überarbeitete und verfeinerte Frage basiert auf der offensichtlichen Redundanz des XmlNamespaceManager in den meiner Meinung nach meisten Fällen und der Verwendung des Namespace-Managers zur Angabe einer Zuordnung des Präfixes zum URI:
Wenn die direkte Zuordnung des Namespace-Präfixes ("cde") zum Namespace-URI (" http://example.com/xmlns/foo ") im Quelldokument explizit angegeben ist:
...<rootNode xmlns:cde="http://example.com/xmlns/foo"...
Was ist die konzeptionelle Notwendigkeit für einen Programmierer, diese Zuordnung neu zu erstellen, bevor eine Abfrage durchgeführt wird?