2009-12-11 138 views
1

我们想通过XPath表达式实现对元素的存在检查。 XPath表达式是在外部定义的。我们尝试使用System.Xml.XPath中的XPathEvaluate扩展方法,但是当我们尝试执行以下操作时,它会发出抱怨。从XPath表达式返回布尔值

XDocument d = new XDocument(
       new XElement("test", 
        new XElement("element"), 
        new XElement("element"))); 
bool b = (bool)d.XPathEvaluate("/test/element[exists()]"); 

此功能目前失败,异常“命名空间管理器或XsltContext需要的。此查询具有前缀,变量,或用户定义的函数。”。如果我们尝试exists(/test/element),我们会得到相同的信息。

我们希望在XPath表达式中表达的其他内容之一是元素的数量,例如, count(/text/element) = 2

测试条件应该是XPath表达式的一部分。

函数调用d.XPathEvaluate("/test/element[last()]")按预期进行评估。

这样可以使用XPathEvaluate吗?

[编辑] 是的。

如果不是,那么.Net框架中是否有其他选择?

[编辑] 是的。

[编辑] 剩余的问题:为什么exists函数不起作用?

回答

2

经过一些更多的实验后,我似乎回答了我自己的问题。

当然你可以做count(/test/element) > 0作为存在检查。 (我们在看这三个人:-()

bool b = (bool)d.XPathEvaluate("count(/test/element) > 0"); 
4

你有没有试过的XPath:

boolean(/test/element) 
+0

不是之前,但只是测试它,它的工作原理。 – 2009-12-11 10:24:51

0

剩下的问题:为什么不 存在功能工作

您所呼叫的存在()函数不正确。The exists() function needs at least one argument.

而不是在一个谓词使用它为您的XPATH表达式,使用XPATH表达式作为存在()函数参数

bool b = (bool)d.XPathEvaluate("exists(/test/element)"); 
+0

我们已经尝试过,结果相同。这是在我的问题中提到的。 – 2009-12-13 12:56:45