2011-09-30 45 views
1
<?xml version="1.0" encoding="utf-8"?> 
<Report p1:schemaLocation="TemplateXXX http://localhost?language=en" Name="TemplateXXX" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance" xmlns="TemplateXXX"> 
    <HEADER attr1="one" attr2="two" /> 
    <Table filename="12345.pdf"> 
     <left> 
     <details> 
      <item/> 
      <item/> 
     </details> 
     </left> 
     <right> 
     <details> 
      <item/> 
      <item/> 
     </details> 
     </right> 
    </Table> 
</Report> 

我想查詢元素和XML文檔,其中一個命名空間在XML中的屬性時遇到了一個奇怪的問題。如何查詢使用XPath的XML元素與現有的命名空間

當我嘗試查詢文件中出現以下XPath查詢頭元素我consistantly得到空結果

XDocument root = XDocument.Load(filePath); 
var element = root.XPathSelectElement("/Report/HEADER"); 

這總是返回null但是那一刻我從文件中刪除命名空間中的查詢返回即將到來的元素。

什麼是我越來越錯了,因爲我得到一些挫敗感。

編輯:更新XML來有效的XML

+2

'/ HEADER'不應該反正工作肯定,因爲它的期待* *根元素當它實際上是報告時,作爲標題。你*有*使用XPath嗎?根據我的經驗,使用LINQ to XML直接查詢更具可讀性 - 特別是在涉及名稱空間的情況下。 –

回答

3

我個人建議你沒有使用XPath做到這一點,但你可以的,如果你真的想要。下面是與示例XML的作品,我已經修復它經過短暫而完整的程序(它不是目前有效的XML ......請儘量提供工作示例下一次):

using System; 
using System.Xml; 
using System.Xml.Linq; 
using System.Xml.XPath; 

class Test 
{ 
    static void Main() 
    { 
     var doc = XDocument.Load("test.xml"); 
     var manager = new XmlNamespaceManager(new NameTable()); 
     manager.AddNamespace("foo", "TemplateXXX"); 

     var query = doc.XPathSelectElement("/foo:Report/foo:HEADER", manager); 
     Console.WriteLine(query); 
    } 
} 

在正常的LINQ to XML查詢你只需使用:

XNamespace ns = "TemplateXXX"; 
XElement header = doc.RootElement.Element(ns + "HEADER"); 

不需要一個命名空間管理等

+0

不,沒有要求使用xpath,我發現有時比linq-to-xml更容易使用。 糾正我,如果我中獎,但我的印象是,即使你有你的xml中的命名空間,你不必包括nsmaepace作爲元素查詢的一部分。 – Marqueone

+0

@codejam:你錯了:)如果XML元素有一個名稱空間,那麼'foo.Element(localName)'的查詢將不會*找到它。幸運的是,LINQ to XML使得它很容易指定完全限定的名稱,如我的示例所示。 –

+0

令人敬畏的喬恩,probelm解決了,證明了fallic:P – Marqueone

相關問題