2013-02-20 53 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"); 
相關問題