我目前正在使用XPath开发Java项目,因为我不是XPath专家,我需要找到一种方法来验证随机XPath表达式的语法,而不是将它们与XML数据相匹配。
我在网上发现了很多XPath验证器,不幸的是它们都需要XML数据。
我迫切需要验证以下表达式:
/cXML/Request/OrderRequest/OrderRequestHeader/Extrinsic/@name[NameOrder]/Name
我非常感谢对这一具体内容的有效性的评论...
答案 0 :(得分:3)
“由于您不是XPath专家”,您在XPath表达式中所犯的大多数错误可能不是语法错误,而是语义错误。遗憾的是,XPath表达式中的大多数错误都不会被检测为语法错误甚至是运行时错误,而只会导致错误的答案。 (在这方面,XPath与正则表达式非常相似。)
你的例子就是一个很好的例子。它在语法上是有效的,但永远不会选择任何东西。那是因为它包含步骤@name[NameOrder]
,它选择具有NameOrder子元素的所有“name”属性。属性永远不会有子节点,所以没有什么能满足这个表达式。 Saxon会给你一个警告,但这不是语法错误。
因此,我认为您进行语法验证的方法对您没有多大帮助。
答案 1 :(得分:2)
我假设您要验证语法,但是如果表达式在xml或xml架构的上下文中有效,则不会。您可以使用compile(..)方法,如果xpath在语法上不正确,它将抛出异常。
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//book[author='Abc']/title/text()");