.Net Nametable (Пространство имен) Проблема - PullRequest
1 голос
/ 02 октября 2009

В .Net я делаю это:

XmlNamespaceManager nsMan = new XmlNamespaceManager(xmlDoc.NameTable);
XmlNodeList nlImages = xmlDoc.SelectNodes("//v:imagedata", nsMan);

И я получаю это исключение:

Namespace prefix 'v' is not defined.

Но если я прерву процесс и напишу это утверждение:

xmlDoc.NameTable.Get("v")

Я получаю "v", так что пространство имен определено ... верно?

В любом случае, чтобы заставить это работать, я должен добавить это:

nsMan.AddNamespace("v", "urn:schemas-microsoft-com:vml");

Чтобы заставить этот запрос XPath работать (я проверил, а пространство имен v определено в исходном XML-документе), так почему же это не работает так, как кажется?

Спасибо за помощь,

-nomad311

1 Ответ

1 голос
/ 02 октября 2009

Это странный способ работы объекта XmlNode и доступа к пространствам имен в документе XML.

К сожалению, вы должны использовать XmlNamespaceManager (как вы делаете в своем коде, опубликованном в вашем вопросе), чтобы использовать пространства имен в XML-документе, который вы обрабатываете.

Из документации MSDN для метода .SelectNodes объекта XmlNode :

Выражения XPath могут включать Пространства имен. Разрешение пространства имен поддерживается с помощью XmlNamespaceManager. Если XPath выражение включает в себя префикс, пара префикса и URI пространства имен должна быть добавлен в XmlNamespaceManager.

Примечание:

Если выражение XPath не включают префикс, предполагается, что URI пространства имен является пустым Пространство имен. Если ваш XML включает в себя пространство имен по умолчанию, вы все равно должны добавить префикс и URI пространства имен для XmlNamespaceManager; иначе ты не будет выбран ни один узел. За подробнее см. Выбор узлов с помощью XPath Navigation .

Для чего бы то ни было, манипулирование XML-документами / узлами с помощью LINQ-To-XML намного проще и более «свободно».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...