2013-02-20 58 views
0

我使用下面的代码:为什么我不能在命名空间上使用XML数据的XPath?

  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变量将返回为空(result2确实会作为XElement返回)。

这是行不通的?我是否错误地设置了命名空间?

+1

边注:政策和活动有不同的命名空间,所以没有办法指定既是你是单一命名空间前缀试图在'/ Policy/Activity'中执行(你尝试使用两个空的命名空间前缀,XPath *总是*映射到空的命名空间 - 请参阅MiMo +1答案)。 – 2013-02-20 19:35:52

回答

2

必须始终使用显式前缀的XPath从零一个参考节点命名空间中的不同势 - 即:

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

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

这是XPath的工作原理设计的方式 - 它不涉及到具体的实施。

+0

谢谢。从我读过的内容来看,我认为我使用的是默认命名空间,并没有意识到我需要指定前缀。 – Kyle 2013-02-20 19:35:45

0

你混合XmlReaderLinq2xml

在Linq2xml应该

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