【问题标题】:Why can I not use an XPath on XML data with namespace?为什么我不能在带有命名空间的 XML 数据上使用 XPath?
【发布时间】:2013-02-20 19:17:45
【问题描述】:

我正在使用以下代码:

            string testingXML = "<Policy><Activity xmlns=\"http://schemas.microsoft.com/netfx/2009/xaml/activities\"></Activity></Policy>";

            var xmlReader = XmlReader.Create( new StringReader(testingXML) );
            var myXDocument = XDocument.Load( xmlReader );
            var namespaceManager = new XmlNamespaceManager( xmlReader.NameTable );
            namespaceManager.AddNamespace("", "http://schemas.microsoft.com/netfx/2009/xaml/activities");

            var result = myXDocument.XPathSelectElement(
                "/Policy/Activity",
                namespaceManager
            );

            var result2 = myXDocument.XPathSelectElement(
                "/Policy",
                namespaceManager
            );

并根据我的理解尝试使用namespaceManager,这应该有助于解决我的问题。但是,如果我运行上面的代码,result 变量会返回为 null(result2 确实会返回为 XElement)。

这不应该工作吗?我是否设置了错误的命名空间?

【问题讨论】:

  • 旁注:Policy 和 Activity 具有不同的命名空间,因此无法像您在 /Policy/Activity 中尝试那样为两者指定单个命名空间前缀(您尝试为两者都使用空命名空间前缀,这在 XPath 中 总是 映射到空命名空间 - 请参阅 MiMo +1 答案)。

标签: c# xpath xml-namespaces linq-to-xml xelement


【解决方案1】:

您必须始终在 XPaths 中使用显式前缀来引用与 null 不同的命名空间中的节点 - 即:

        namespaceManager.AddNamespace("msact", "http://schemas.microsoft.com/netfx/2009/xaml/activities");

        var result = myXDocument.XPathSelectElement(
            "/Policy/msact:Activity",
            namespaceManager
        );

这是 XPath 设计的工作方式 - 它与具体实现无关。

【讨论】:

  • 谢谢。从我读过的内容来看,我认为我使用的是默认命名空间,但没有意识到我需要指定前缀。
【解决方案2】:

您将XmlReaderLinq2xml 混合在一起

在 Linq2xml 中应该是

XDocument doc=XDocument.Parse(testingXML);
XNamespace ns="http://schemas.microsoft.com/netfx/2009/xaml/activities";
doc.Element(ns+"Activity");

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2020-01-22
    • 2012-06-09
    • 2023-04-04
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多