C # XPathSelectElement и xml с атрибутом xmlns = "http://www.w3.org/2000/09/xmldsig#" Help - PullRequest
3 голосов
/ 15 июля 2011

Мне нужно прочитать элемент xml с атрибутом xmlns = "http://www.w3.org/2000/09/xmldsig#". XPathSelectElement выдает ошибку «Ссылка на объект не установлена ​​для экземпляра объекта».

Вот пример кода.

var xml = "<root><tagA>Tag A</tagA><tagB>Tag B</tagB></root>";
XDocument xd = XDocument.Parse(xml);
var str = xd.XPathSelectElement("/root/tagB").ToString(SaveOptions.DisableFormatting);
Console.WriteLine(str);

Результат вышеприведенного кода:

<tagB>Tag B</tagB>

Если я поставлю атрибут,

var xml = "<root><tagA>Tag A</tagA><tagB xmlns=\"http://www.w3.org/2000/09/xmldsig#\">Tag B</tagB></root>";

Я получил ошибку.

Object reference not set to an instance of an object.

Я что-то здесь упускаю? Может кто-нибудь, пожалуйста, помогите мне. (Я знаю, что могу использовать другие методы. Я просто хочу знать, чего мне здесь не хватает)

Большое спасибо.

Ответы [ 3 ]

6 голосов
/ 15 июля 2011

Вы можете зарегистрировать пространство имен элемента в XmlNamespaceManager :

XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
nsmgr.AddNamespace("ns", "http://www.w3.org/2000/09/xmldsig#");

var str = xd.XPathSelectElement("/root/ns:tagB", nsmgr)
            .ToString(SaveOptions.DisableFormatting);
Console.WriteLine(str);
2 голосов
/ 15 июля 2011

Вы должны прочитать о XML.tagB во втором примере находится в другом пространстве имен.По умолчанию вы запрашиваете пустое пространство имен, если вы хотите запросить другое, вам нужно использовать менеджер пространства имен и назначить пространство имен префиксу, а затем префикс имени элемента с тем же префиксом, и он будет работать снова.

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xd.CreateNavigator().NameTable);
nsmgr.AddNamespace("xmldsig", "http://www.w3.org/2000/09/xmldsig#");
var str = xd.XPathSelectElement("/root/xmldsig:tagB", nsmgr).ToString(SaveOptions.DisableFormatting);
0 голосов
/ 15 июля 2011

Это не просто атрибут.Например, попробуйте с помощью

var xml = "<root><tagA>Tag A</tagA><tagB attr=\"http://www.w3.org/2000/09/xmldsig#\">Tag B</tagB></root>";

убедиться, что это работает.

Проблема в том, что вы изменяете пространство имен с помощью xmlns, поэтому ваш XPath больше не совпадает.

...