Я подошел как-то сухим, чем к почему - по крайней мере, в .NET Framework - необходимо использовать XmlNamespaceManager
для обработки пространств имен (или довольно неуклюжих и verbose [local-name()=...
предикат/функция XPath/независимо) при выполнении запросов XPath. я do понять, почему пространства имен необходимы или, по крайней мере, полезны, но почему он настолько сложный?
Чтобы запросить простой 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: Мое первое раздражение. Если я правильно понимаю, это просто добавление ссылки пространства имен на родительский/корневой тег (используется как часть дочернего тега node или нет) так:
<?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
" ), чтобы найти node, который даже не использует префикс. Как это имеет смысл? Что не так (концептуально) с помощью 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
, чтобы сделать запрос для одного node...
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"...
Какова концептуальная потребность программиста воссоздать это сопоставление перед тем, как сделать запрос?