Зачем нужен XmlNamespaceManager?

Я так и не понял почему - по крайней мере в .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") (что будет соответствовать Some Text Here)

Загадка №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"...

какова концептуальная необходимость для программиста воссоздавать это отображение перед выполнением запроса?

66
задан Code Jockey 25 August 2011 в 14:53
поделиться