2009-10-02 2 views
1

В .Net я это делаю:.Net NameTable (пространство имен) Проблема

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

Это причуда, как объект XmlNode работает, и получает доступ к Namespaces в пределах документа XML.

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

Из MSDN documentation for the .SelectNodes method of the XmlNode object:

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

Примечание:

Если выражение XPath не включать префикс, предполагается, что пространство имен URI является пустым пространства имен. Если ваш XML содержит пространство имен по умолчанию, вы все равно должны добавить префикс и URI пространства имен в XmlNamespaceManager; в противном случае вы не получите ни один выбранный узел . Для дополнительную информацию см. Select Nodes Using XPath Navigation.

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

Смежные вопросы