我正在为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);
并且它不起作用,我认为这不是命名空间问题。
答案 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);
(我不知道c
和f
元素应该在哪个命名空间中 - 适当调整。)
(注意,当没有反斜杠且字符串在一行上时,不需要使用逐字字符串文字。)
答案 1 :(得分:0)
您没有为XPath表达式中的节点指定OpenXML名称空间。我所知道的所有库存.NET XPath API都不会从文档上下文继承任何名称空间 - 因此,如果您没有显式指定它,并且不在XPath表达式中使用任何前缀,则将其视为空名称空间。
假设这是对XmlNode.SelectNode
的调用,则需要2参数重载,其中第二个参数为XmlNamespaceManager
。