2012-10-01 32 views
1

我知道这是一个奇怪的问题!如何使用XPath伪造不存在的XML节点?

该要求是由于现有代码期望XPath查询的结果为单个节点。不幸的是,由于我们控制之外的因素,我们无法对代码进行更改(除非没有解决方法,这可能意味着我们将不得不推迟发布)。

以我的情况下,目前的XPath返回一个整数值(计数):

count(/someNode/node) 

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

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

P.S.而且,是的,我们将着眼于重构ASAP问题!

+0

我想必须有一些其他的要求,我错过了。如果您只需要XPath返回节点,则可以将XPath更改为“/”。你真的需要你的XPath来返回一个节点*,它的文本内容等于'count(/ someNode/node)'*的值吗? – LarsH

+1

顺便说一句问题的有用性。我经常希望能够在XPath中构建一个节点。当然,如果你能做到这一点,所有的花里胡哨的事情,你会接近复制XSLT。 :-) – LarsH

回答

2

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

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

这可能是非常低效的,这取决于你的输入文件就像;如果输入文档中没有包含正确数字的文本节点,它可能会失败。但是在某些情况下它可以做到这一点,并可能帮助您避免延迟发布。例如,如果输入的XML很小,并且count(...)的可能值范围有限,并且您可以对XML进行更改,则可以在输入中包含额外的文本或属性节点XML以确保所需的数字可用。

+1

谢谢,@LarsH。这是一个有趣/有创意的想法。不幸的是,计数值出现在文档中的可能性很小,我们也无法控制传入的XML。 –

+1

虽然这不能解决问题(由于设计中的XPath限制),但这种方法绝对非常接近可行的解决方案。 –

+0

@IgorPashchuk,感谢慷慨的接受。 :-) – LarsH

2

的XPath选择输入文档中的节点,它不能创建新的或“假”的人,所以我认为,如果你想计算表达式count(/someNode/node)您需要使用Evaluate方法http://msdn.microsoft.com/en-us/library/2c16b7x8.aspx,而不是SelectSingleNode

+0

谢谢,马丁。 Evaluate()方法的确是我将用于这种情况。 –

相关问题