Кажется, что перевод xpath не работает, как ожидалось в Java8 - PullRequest
1 голос
/ 17 февраля 2020

Я много искал, чтобы найти точный эквивалент, но не смог найти. Вопрос здесь заключается в том, что метод перевода java8-javax. xml .xpath. * Не дает ожидаемого результата.

example-

Actual-

XPathExpression xpathitemtype = xpath.compile("//*[@type=\"" + xpathType + "\"]/ancestor::itemtype");
final NodeList itemType = (NodeList) xpathitemtype.evaluate(document, XPathConstants.NODESET);

используя translate-

XPathExpression xpathitemtype = xpath.compile("//*[translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='" + xpathType.toLowerCase() + "']/ancestor::itemtype");
final NodeList itemType = (NodeList) xpathitemtype.evaluate(document, XPathConstants.NODESET);

Теперь я использовал translate, потому что мне нравится получать itemType независимо от случая в данном примере xml document-

, если value is- exportMedia или ExportMedia или EXportMEdia в любом случае просто возвращают вывод.

Теперь в приведенном выше примере оба возвращают один и тот же вывод, который, как мне кажется, translate не работает в моем случае

 <itemtype code="RemoveCatalogVersionJob">
 <attribute qualifier="catalogVersion" type="CatalogVersion">
                    <persistence type="property"/>
                </attribute>
                <attribute qualifier="removedItems" type="ExportMEdia">
                    <persistence type="property"/>
                </attribute>
                <attribute qualifier="notRemovedItems" type="exportMedia">
                    <persistence type="property"/>
                </attribute>
 </itemtype>

Теперь я хочу значение элемента если это какие-либо случаи экспортаMedia

1 Ответ

0 голосов
/ 17 февраля 2020

Ваш код работает правильно, а XPath оценивается правильно. Проблема заключается в том, что выражение XPath в конце содержит «ancestor :: itemtype», а оба совпадающих элемента «attribute» имеют только одного предка с именем «itemtype».

Если вы измените свой код для теста ...

    XPathExpression xpathItemType = xpath.compile("//*[translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='" + xpathType.toLowerCase() + "']/@qualifier");
    final NodeList itemType = (NodeList) xpathItemType.evaluate(document, XPathConstants.NODESET);

    for(int i = 0; i < itemType.getLength(); i ++) {
        System.out.println(itemType.item(i).getNodeValue());
    }

... вывод будет

removedItems
notRemovedItems

..., показывая, что и "ExportMEdia", и "exportMedia" соответствуют вашему выражению.

В качестве альтернативы вы можете изменить свой ввод XML на что-то вроде этого (просто пример, не зная реальной схемы):

<items>
    <itemtype code="RemoveCatalogVersionJob">
        <attribute qualifier="notRemovedItems" type="exportMedia">
            <persistence type="property"/>
        </attribute>
    </itemtype>
    <itemtype code="RemoveCatalogVersionJob1">
        <attribute qualifier="removedItems" type="ExportMEdia">
            <persistence type="property"/>
        </attribute>
    </itemtype>
</items>

Ваш код будет сопоставлять оба типа элемента с code = "RemoveCatalogVersionJob" с code = "RemoveCatalogVersionJob1".

...