Я довольно сухо подошел к , почему - по крайней мере, в .Net Framework - необходимо использовать XmlNamespaceManager
для обработки пространств имен (или довольно громоздких и многословный [local-name()=...
предикат / функция XPath) при выполнении запросов XPath. Я действительно понимаю, почему пространства имен необходимы или хотя бы полезны, но почему это так сложно?
Для запроса простого XML-документа (без пространств имен) ...
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode>
<nodeName>Some Text Here</nodeName>
</rootNode>
... можно использовать что-то вроде doc.SelectSingleNode("//nodeName")
(что будет соответствовать <nodeName>Some Text Here</nodeName>
)
Mystery # 1 : Мое первое раздражение - Если я правильно понимаю - это просто добавление ссылки на пространство имен к родительскому / корневому тегу (используется ли он как часть тег дочернего узла или нет) вроде так:
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode xmlns="http://someplace.org">
<nodeName>Some Text Here</nodeName>
</rootNode>
... требуется несколько дополнительных строк кода, чтобы получить тот же результат:
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("ab", "http://s+omeplace.org")
Dim desiredNode As XmlNode = doc.SelectSingleNode("//ab:nodeName", nsmgr)
... по сути, придумывает несуществующий префикс ("ab
"), чтобы найти узел, который даже не использует префикс. Как это имеет смысл? Что не так (концептуально) с doc.SelectSingleNode("//nodeName")
?
Mystery # 2 : Допустим, у вас есть документ XML с префиксами:
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode xmlns:cde="http://someplace.org" xmlns:feg="http://otherplace.net">
<cde:nodeName>Some Text Here</cde:nodeName>
<feg:nodeName>Some Other Value</feg:nodeName>
<feg:otherName>Yet Another Value</feg:otherName>
</rootNode>
... Если я правильно понимаю, вам нужно добавить оба пространства имен в XmlNamespaceManager
, чтобы сделать запрос для одного узла ...
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("cde", "http://someplace.org")
nsmgr.AddNamespace("feg", "http://otherplace.net")
Dim desiredNode As XmlNode = doc.SelectSingleNode("//feg:nodeName", nsmgr)
... Зачем, в этом случае, мне (концептуально) нужен менеджер пространства имен?
** УДАЛЕНО в комментарии ниже **
Редактировать Добавлено:
Мой пересмотренный и уточненный вопрос основан на кажущейся избыточности XmlNamespaceManager в том, что, как я считаю, в большинстве случаев, и использовании диспетчера пространства имен для указания сопоставления префикса с URI:
Когда прямое отображение префикса пространства имен («cde») на URI пространства имен («http://someplace.org")» явно указано в исходном документе:
...<rootNode xmlns:cde="http://someplace.org"...
Какова концептуальная потребность программиста воссоздать это отображение перед выполнением запроса?