Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找重复的XML元素名称(带变量的xPath)_Java_Xml_Xpath - Fatal编程技术网

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

Java 查找重复的XML元素名称(带变量的xPath),java,xml,xpath,Java,Xml,Xpath,在我的JAVA项目中,我正在使用XPath1.0解析器和CLiXML,我正在尝试设置CLiXML约束规则文件 如果在特定子元素下有重复的元素名称,我想显示一个错误 比如说 <parentNode version="1"> <childA version="1"> <ignoredChild/> </childA> <childB version="1"> <ignoredCh

在我的JAVA项目中,我正在使用XPath1.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>
原因:class org.jaxen.saxpath.XPathSyntaxException:count(.//PLC映射//*/$classCount:23:应为“.”、“..”、“@”和“*”中的一个,
因为我希望代码检查每个子名称,并使用子名称的名称运行另一个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
   }
XPathExpression XPathExpression=xPath.compile(“//parentNode/*”);
NodeList children=(NodeList)xPathExpression.evaluate(配置,XPathConstants.NODESET);
for(int i=0;i
这不能用单个XPath 1.0表达式来完成(请参阅我今天回答的

下面是一个XPath 2.0表达式(如果可以使用XPath 2.0):


这将选择作为XML文档顶部元素的子元素且多次出现的所有元素。

我更新了我的问题,意识到我没有那么清楚。我不想在Java中执行自定义“约束”检查,我想在.CLX文件中设置它。@Dan2k3k4抱歉,没有给出是/否的显式XPath表达式马上回答。
/*/*[(for $n in name() 
      return count(/*/*[name()=$n]) 
      )
     >1
     ]