C#XPathSelectElement和xml,属性为xmlns =“http://www.w3.org/2000/09/xmldsig#”帮助

时间:2011-07-15 07:54:52

标签: c# xml linq xpath xml-namespaces

我需要读取一个属性为xmlns =“http://www.w3.org/2000/09/xmldsig#”的xml元素。 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 个答案:

答案 0 :(得分:6)

您可以在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);

答案 1 :(得分:2)

您应该阅读一些有关XML的内容。第二个示例中的tagB位于不同的命名空间中。默认情况下,您要查询空命名空间,如果要查询另一个需要使用命名空间管理器并将命名空间分配给前缀,然后使用相同的前缀为元素名称添加前缀,它将再次起作用。 / p>

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);

答案 2 :(得分:0)

这不仅仅是任何属性。例如,尝试使用

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

看它是否有效。

问题是您使用xmlns更改了命名空间,因此您的XPath不再匹配。