如何使用XPath伪造不存在的XML节点?

时间:2012-10-01 16:10:21

标签: .net xml xpath

我知道这是一个奇怪的问题!

该要求是由于现有代码要求XPath查询的结果是单个节点。遗憾的是,由于我们无法控制的因素,我们目前无法更改代码(除非不存在解决方法,这可能意味着我们必须延迟发布)。

在我的例子中,XPath当前返回一个整数值(count):

count(/someNode/node)

代码使用XPathNavigator.SelectSingleNode()方法,当然,该方法失败,因为结果不是节点。

相反,我需要XPath来返回一个节点,尽管是一个假节点。可能吗?请注意,因为使用了.NET,所以XPath必须是1.0(而不是2.0)。

P.S。并且,是的,我们将尽快重构有问题的代码!

2 个答案:

答案 0 :(得分:2)

XPath选择输入文档中的节点,它不能创建新节点或“假”节点,所以我想如果你想评估表达式count(/someNode/node),你需要使用Evaluate方法{ {3}}而非SelectSingleNode

答案 1 :(得分:2)

如果您需要XPath表达式来返回其文本内容等于count(/someNode/node)的值的节点,您可以这样做:

"(//text() | //*/@*)[. = count(/someNode/node)]"

这可能非常低效,取决于您的输入文档是什么样的;如果输入文档中没有包含正确数字的文本节点,它可能会失败。但是在某些情况下它可以解决问题,并可能帮助您避免延迟释放。

例如,如果您的输入XML很小,并且count(...)的可能值范围有限,并且您能够对XML进行更改,那么您可以包含额外的文本或属性节点在您的输入XML中,以确保所需的数字可用。