我正在使用以下代码:
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返回)。
这应该不起作用吗?我是否错误地设置了命名空间?
答案 0 :(得分:2)
您必须始终在XPath引用节点中使用显式前缀,该节点与null中的节点不同 - 即:
namespaceManager.AddNamespace("msact", "http://schemas.microsoft.com/netfx/2009/xaml/activities");
var result = myXDocument.XPathSelectElement(
"/Policy/msact:Activity",
namespaceManager
);
这是XPath按设计工作的方式 - 它与具体实现无关。
答案 1 :(得分:0)
您正在将XmlReader
与Linq2xml
混合
在Linq2xml中它应该是
XDocument doc=XDocument.Parse(testingXML);
XNamespace ns="http://schemas.microsoft.com/netfx/2009/xaml/activities";
doc.Element(ns+"Activity");