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

发布于 2024-11-23 17:03:44 字数 831 浏览 2 评论 0原文

我需要读取具有属性 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.

我在这里错过了什么吗?谁能帮我一下。 (我知道我可以通过使用其他方法来获得。我只是想知道我在这里缺少什么)

非常感谢。

I need to read an xml element which has attribute xmlns="http://www.w3.org/2000/09/xmldsig#".
XPathSelectElement is giving error "Object reference not set to an instance of an object."

Here is the sample code.

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

The result of the above code is:

<tagB>Tag B</tagB>

If I put attribute,

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

I got error.

Object reference not set to an instance of an object.

Am I missing something here? Can anyone please help me out. (I know I can get by using other methods. I just want to know what I am missing here)

Thank you very much.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

羞稚 2024-11-30 17:03:44

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

You can register the element's namespace in an 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);
深空失忆 2024-11-30 17:03:44

您应该阅读一些有关 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);

You should read some about XML. The tagB in the second example is in a different namespace. By default, you're querying the empty namespace, if you want to query a different one you need to use a namespace manager and assign the namespace to a prefix, then prefix the element name with this same prefix and it will work again.

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);
夜深人未静 2024-11-30 17:03:44

它不仅仅是任何属性。例如尝试

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

看看它是否有效。

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

It's not just any attribute. For example try with

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

to see that it works.

The problem is that you change the namespace by using xmlns, so your XPath doesn't match anymore.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文