[Java] 중복 된 XML 요소 이름 찾기 (변수가있는 xPath)


Answers

이것은 하나의 XPath 1.0 표현으로는 불가능합니다 (오늘 제가 대답 한 유사한 질문을 보십시오).

다음은 하나의 XPath 2.0 표현식입니다 (XPath 2.0을 사용할 수있는 경우).

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

XML 문서의 최상위 요소의 하위 요소이며 두 번 이상 나타나는 모든 요소를 ​​선택합니다.

Question

내 JAVA 프로젝트에서 CLiXML과 함께 XPATH 1.0 파서를 사용하고 있습니다. 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보다 크면 오류가 발생합니다.

어떤 아이디어?




Links