繁体   English   中英

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

[英]Why can I not use an XPath on XML data with namespace?

我正在使用以下代码:

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

这应该不起作用吗? 我是否错误地设置了命名空间?

您必须始终在XPath中使用显式前缀,引用与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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM