小编典典

查找重复的XML元素名称(带有变量的xPath)

java

我在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,则应该给出错误。

有任何想法吗?


阅读 385

收藏
2020-11-30

共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
   }
2020-11-30