为什么我不能在带有名称空间的XML数据上使用XPath

本文关键字:数据 XML XPath 空间 不能 有名称 为什么 | 更新日期: 2023-09-27 18:00:22

我使用以下代码:

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

这不应该奏效吗?我是否设置的命名空间不正确?

为什么我不能在带有名称空间的XML数据上使用XPath

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

        namespaceManager.AddNamespace("msact", "http://schemas.microsoft.com/netfx/2009/xaml/activities");
        var result = myXDocument.XPathSelectElement(
            "/Policy/msact:Activity",
            namespaceManager
        );

这是XPath的设计工作方式——它与特定的实现无关。

您正在将XmlReaderLinq2xml 混合

在Linq2xml中,它应该是

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