recorrer online nodos name expresión evaluar ejemplos debe consultas conjunto con como altova java xml xpath

java - online - Buscar nombres de elementos XML duplicados(xPath con variable)



xpath selenium (2)

Estoy usando analizadores XPATH 1.0 junto con CLiXML en mi proyecto JAVA, estoy tratando de configurar un archivo de reglas de restricción CLiXML.

Me gustaría mostrar un error si hay nombres de elementos duplicados en un elemento secundario específico.

Por ejemplo

<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 aparece más de una vez, por lo que mostraría un error al respecto.

NOTA: Solo quiero ''verificar / contar'' el nombre del Elemento, no los atributos dentro o los elementos secundarios del elemento.

El código dentro de mi archivo de reglas .clx que probé es:

<forall var="elem1" in=".//parentNode/*"> <equal op1="count(.//parentNode/$elem1)" op2="1"/> </forall>

Pero eso no funciona, me sale el error:

Caused by: class org.jaxen.saxpath.XPathSyntaxException: count(.//PLC-Mapping/*/$classCount: 23: Expected one of ''.'', ''..'', ''@'', ''*'', <QName>

Como quiero que el código compruebe cada nombre de niño y ejecute otra consulta de xPath con el nombre del nombre de niño - si el recuento es superior a 1, entonces debería dar un error.

¿Algunas ideas?


Intente obtener una lista de subnodos con la expresión de ruta apropiada y busque duplicados en esa lista:

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 }


Esto no se puede hacer con una sola expresión XPath 1.0 (vea esta pregunta similar que respondí hoy).

Aquí hay una expresión única de XPath 2.0 (en caso de que pueda usar XPath 2.0):

/*/*[(for $n in name() return count(/*/*[name()=$n]) ) >1 ]

Esto selecciona todos los elementos que son secundarios del elemento superior del documento XML y que aparecen más de una vez.