2009-07-08 30 views
2

我正在爲Excel表單打開XML文檔格式。爲什麼XPath表達式不會在C#中返回任何結果,但它在C#之外呢?

var nodeList = WorksheetXml.SelectNodes(@"//c[child::f]"); 

它應該返回所有具有公式的行,但它不返回任何內容。氧氣編輯器上的同一個xml,當應用相同的xpath表達式時,返回所有這些。

我在複製WorksheetXml內部xml以確保內容是相同的......你知道爲什麼C#不能按預期的方式工作嗎?


編輯:命名空間問題

我已經把這個:

var manager = new XmlNamespaceManager(WorksheetXml.NameTable); 
manager.AddNamespace(string.Empty, @"http://schemas.openxmlformats.org/spreadsheetml/2006/main"); 
manager.AddNamespace("r", @"http://schemas.openxmlformats.org/officeDocument/2006/relationships"); 

var nodeList = WorksheetXml.SelectNodes(@"//c[child::f]", manager); 

,並沒有工作,我認爲這不是一個命名空間的問題。

+0

btw,「// c [f]」會更簡單; -p – 2009-07-08 20:06:10

回答

3

氧氣編輯器有可能以不同方式處理命名空間嗎?我的猜測是c元素位於命名空間中,但您沒有指定它。

查看this very similar question查看示例代碼 - 如果這不是問題,請發佈更多詳細信息。

編輯:您發佈的代碼仍然不使用XPath中的名稱空間。試試這個:

var manager = new XmlNamespaceManager(WorksheetXml.NameTable); 
manager.AddNamespace("n", 
    "http://schemas.openxmlformats.org/spreadsheetml/2006/main"); 
manager.AddNamespace("r", 
    "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); 

var nodeList = WorksheetXml.SelectNodes("//n:c[child::n:f]", manager); 

(我不知道哪個命名空間中的cf元素意思是在 - 適當調整。)

(請注意,有沒有必要使用逐字字符串時您沒有反斜槓,字符串位於同一行上。)

+0

c元素來自默認命名空間。我已經添加了一個namespacemgr,它仍然不返回任何東西=/ – 2009-07-08 20:32:44

+0

這是哪裏默認的命名空間?我相信你不是指空的名字空間。你的意思是主要還是關係?看我的編輯。 – 2009-07-08 21:13:13

0

您沒有爲XPath表達式中的節點指定OpenXML命名空間。我所知道的所有.NET XPath API都不會從文檔上下文繼承任何命名空間 - 因此,如果您沒有明確指定它,並且不在XPath表達式中使用任何前綴,那麼它將被視爲空名稱空間。

假設這是對XmlNode.SelectNode的調用,則需要2參數重載,其中第二個參數是XmlNamespaceManager

相關問題