Найти дублированные имена элементов XML (xPath с переменной) - PullRequest
0 голосов
/ 06 июля 2011

Я использую парсеры XPATH 1.0 вместе с CLiXML в своем проекте JAVA, я пытаюсь настроить файл правил ограничения 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, то это должно выдать ошибку.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Это невозможно сделать с помощью одного выражения XPath 1.0 (см. этот похожий вопрос Я ответил сегодня).

Вотодиночное выражение XPath 2.0 (в случае, если вы можете использовать XPath 2.0):

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

Выбирает все элементы, которые являются потомками верхнего элемента XML-документа и встречаются более одного раза.

1 голос
/ 06 июля 2011

Просто попробуйте получить список подузлов с соответствующим выражением пути и проверьте наличие дубликатов в этом списке:

   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
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...