【问题标题】:C# XPathSelectElement and xml with attribute xmlns="http://www.w3.org/2000/09/xmldsig#" HelpC# XPathSelectElement 和 xml 属性 xmlns="http://www.w3.org/2000/09/xmldsig#" 帮助
【发布时间】:2011-07-15 07:54:51
【问题描述】:

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

我在这里遗漏了什么吗?谁能帮帮我。 (我知道我可以通过其他方法得到。我只是想知道我在这里缺少什么)

非常感谢。

【问题讨论】:

    标签: c# xml linq xpath xml-namespaces


    【解决方案1】:

    您可以在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】:

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

    【讨论】:

      【解决方案3】:

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

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

      看看它是否有效。

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

      【讨论】:

        猜你喜欢
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 2017-01-27
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多