为什么XPath表达式没有';在C#中不返回任何结果,但在C#之外返回?

为什么XPath表达式没有';在C#中不返回任何结果,但在C#之外返回?,c#,xml,xpath,C#,Xml,Xpath,我正在为excel工作表开发开放式XML文档格式 var nodeList = WorksheetXml.SelectNodes(@"//c[child::f]"); 它应该返回包含公式的所有行,但不返回任何内容。氧气编辑器上的相同xml在应用相同的xpath表达式时,将返回所有xml 我正在复制工作表xml内部xml,以确保内容相同。。。你知道为什么C#没有按预期的方式工作吗 编辑:名称空间问题 我把它放在: var manager = new XmlNamespaceManager(Wo

我正在为excel工作表开发开放式XML文档格式

var nodeList = WorksheetXml.SelectNodes(@"//c[child::f]");
它应该返回包含公式的所有行,但不返回任何内容。氧气编辑器上的相同xml在应用相同的xpath表达式时,将返回所有xml

我正在复制工作表xml内部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
元素位于名称空间中,但您没有指定名称空间

请参阅示例代码-如果这不是问题,请发布更多详细信息

编辑:您发布的代码仍然没有在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
元素应该在哪个名称空间中-请适当调整。)


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

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


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

顺便说一句,“//c[f]”会更简单-pI已经更改了调用,将管理器作为参数传递,但它仍然不起作用=/它不起作用,因为在XPath中,没有前缀的元素始终位于空命名空间中(即没有URI),而不管您在XmlNamespaceManager中做了什么。请参阅:使用表达式上下文中的命名空间声明将节点测试中的QName扩展为扩展名称。。。不使用使用xmlns声明的默认命名空间:如果QName没有前缀,则命名空间URI为null(这与扩展属性名的方式相同)。必须在XPath中使用前缀才能使其工作。c元素来自默认名称空间。我添加了一个namespacemagr,但它仍然没有返回任何=/的值,这里的默认名称空间是哪个?我肯定你不是指空名称空间。你是说主要的还是关系?请参阅我的编辑。我已经在没有XPath的情况下解决了这个问题,因为XPath不起作用,我不得不在上周交付代码。创建这个“n”-即使在xml中这是“空”名称空间,而c只是…-并且将c作为n:c处理会有所帮助吗?是的,因为它实际上不在空名称空间中,它在该文档级别的默认名称空间中,由祖先的xmlns=“…”属性指定。