为什么XPath表达式不会在C#中返回任何结果,但它在C#之外?

时间:2009-07-08 19:58:46

标签: c# xml xpath

我正在为excel表格开发Open XML文档格式。

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

它应该返回带有公式的所有行,但它不会返回任何内容。 Oxygen Editor上的相同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);

并且它不起作用,我认为这不是命名空间问题。

2 个答案:

答案 0 :(得分:3)

Oxygen Editor是否可能以不同方式处理命名空间?我的猜测是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元素应该在哪个命名空间中 - 适当调整。)

(注意,当没有反斜杠且字符串在一行上时,不需要使用逐字字符串文字。)

答案 1 :(得分:0)

您没有为XPath表达式中的节点指定OpenXML名称空间。我所知道的所有库存.NET XPath API都不会从文档上下文继承任何名称空间 - 因此,如果您没有显式指定它,并且不在XPath表达式中使用任何前缀,则将其视为空名称空间。

假设这是对XmlNode.SelectNode的调用,则需要2参数重载,其中第二个参数为XmlNamespaceManager