использование XmlNamespaceManager для получения списка всех пространств имен - PullRequest
2 голосов
/ 15 марта 2012

Я пытаюсь получить список всех определенных пространств имен по XmlNamespaceManager в этом коде:

var manager = new XmlNamespaceManager(xmlDoc.NameTable);
var dic = manager.GetNamespacesInScope(XmlNamespaceScope.All);

, и это мой xml:

<?xml version='1.0' encoding='UTF-8'?>
<psf:PrintCapabilities 
 version='1' 
 xmlns:psf='http://schemas.microsoft.com/windows/2003/08/printing/printschemaframework' 
 xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
 xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
 xmlns:ns0000='http://schemas.microsoft.com/windows/printing/oemdriverpt/Lexmark T650/6.1.7601.17514/' 
 xmlns:psk='http://schemas.microsoft.com/windows/2003/08/printing/printschemakeywords'>

 </psf:PrintCapabilities>

Интересно, метод GetNamespacesInScope ()возвращает только один элемент ( key = "xml", значение = "http://www.w3.org/XML/1998/namespace")

Чего здесь не хватает?

Примечание: даже если я использую один из определенныхПрефиксы пространства имен (например, путем добавления <ns0000:a>hi</ns0000:a>) ничего не меняют.

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Попробуйте использовать XPathDocument, а также XmlNamespaceScope ... Примерно так будет работать

 XPathDocument x = new XPathDocument(new StringReader(xml));
 XPathNavigator foo = x.CreateNavigator();
 foo.MoveToFollowing(XPathNodeType.Element);
 IDictionary<string, string> namespaces = foo.GetNamespacesInScope(XmlNamespaceScope.All);
0 голосов
/ 16 марта 2012

Я считаю, что ваша проблема в том, что это не пространства имен, это объявления пространств имен.

Если бы вы на самом деле использовали эти пространства имен, то они существовали бы как пространство имен на узлах в таблице имен, поэтому XmlNamespaceManager покажет их вам. На самом деле он показывает только пространство имен xml, которое неявно присутствует во всех XML-документах.

...