Я так и не понял почему - по крайней мере в .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")
(что будет соответствовать
)
Загадка №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")
?
Загадка №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"...
какова концептуальная необходимость для программиста воссоздавать это отображение перед выполнением запроса?