Ich bin mir ziemlich sicher , warum - zumindest im .Net Framework - bei der Ausführung von XPath-Abfragen ein verwendet werden XmlNamespaceManager
muss, 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?