我在JAVA项目中将XPATH 1.0解析器与CLiXML一起使用,我试图设置CLiXML约束规则文件。
如果特定子项下的元素名称重复,我想显示一个错误。
例如
<parentNode version="1"> <childA version="1"> <ignoredChild/> </childA> <childB version="1"> <ignoredChild/> </childB> <childC version="4"> <ignoredChild/> </childC> <childA version="2"> <ignoredChild/> </childA> <childD version="6"> <ignoredChild/> </childD> </parentNode>
childA出现不止一次,因此我将显示一个错误。
注意:我只想“检查/计数”元素名称,而不是元素内部的属性或元素的子元素。
我尝试过的.clx规则文件中的代码是:
<forall var="elem1" in=".//parentNode/*"> <equal op1="count(.//parentNode/$elem1)" op2="1"/> </forall>
但这不起作用,我得到了错误:
Caused by: class org.jaxen.saxpath.XPathSyntaxException: count(.//PLC-Mapping/*/$classCount: 23: Expected one of '.', '..', '@', '*', <QName>
因为我希望代码检查每个子名称,并使用该子名称的名称运行另一个xPath查询-如果计数大于1,则应该给出错误。
有任何想法吗?
只需尝试获取具有适当路径表达式的子节点列表,然后检查该列表中是否存在重复项即可:
XPathExpression xPathExpression = xPath.compile("//parentNode/*"); NodeList children = (NodeList) xPathExpression.evaluate(config, XPathConstants.NODESET); for (int i = 0; i < children.getLength(); i++) { // maintain hashset of clients here and check if element is already there }