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

标签 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);

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

最佳答案

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 元素应该位于哪个命名空间 - 适当调整。)

(请注意,当没有反斜杠且字符串位于一行时,无需使用逐字字符串文字。)

关于c# - 为什么 XPath 表达式在 C# 中不返回任何结果,但在 C# 之外却返回任何结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1100232/

相关文章:

java - 对资源名称的限制或如何进行通用国际化

java - 将xml字符串转换为java对象: getting `details` as null?

python - 第 n 次出现的 td 跨度 :nth-child(2) 的 Selenium CSS 选择器

java - 如果 Java 中的 XML 中不存在节点或子节点,如何 XPath 返回空字符串

c# - 如何为 WIFE 生成发行人指纹

c# - GetDirectories - 从目录中仅检索几个文件夹

c# - 在 SQL Server 中保存浮点值

c# - LINQ - 选择一个对象的属性以供进一步使用,而不是在每个地方取消引用它

php - 下载 xml 时 curl 超时

xpath - 使用 capybara 点击 Href 链接