2009-07-08 25 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

相关问题