Поведение компиляции XPath - PullRequest
1 голос
/ 13 марта 2019

Я тестирую свое приложение и понял, что поведение при компиляции отличается.

Например, если мое выражение для компиляции:

XPathExpression expr = xPath.compile("/DocDetails/TransactionSignature");

И:

XPathExpression expr2 = xPath.compile("/DocDetails/" + x); 

x объявлен как строковый тип данных.

Допустим, x в expr2 равен «abc», XPathExpression скомпилирован без проблем.

Но если x в expr2 равен «123abc»ИЛИ «123», XPathExpression генерирует:

javax.xml.transform.TransformerException: ожидается шаг расположения после токена '/' или '//'.

Просто любопытно по поводу этого поведения ..

Вот полный код для справки:

        String document = "C:/Users/Eunice/Documents/MITS/doc.xml";
        String document2 = "C:/Users/Eunice/Documents/MITS/doc2.xml";

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(document);

        Document doc2 = builder.parse(document2);

        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xPath = xPathFactory.newXPath();
        XPathExpression expr = xPath.compile("/DocDetails/TransactionSignature");
        Node node = (Node)expr.evaluate(doc, XPathConstants.NODE);

        String x = node.getTextContent();

        System.out.println(x);

        XPathExpression expr2 = xPath.compile("/DocDetails/" + x);
        Node node2 = (Node)expr2.evaluate(doc2, XPathConstants.NODE);

        if (node2 == null)
            System.out.println("null");
        else 
            System.out.println("not null " + node2.getTextContent());

А это XML-файл:

<DocDetails>
    <TransactionSignature>abc123</TransactionSignature>
</DocDetails>

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Я наконец нашел ответ после долгих поисков!

На самом деле нельзя начинать тег элемента с цифр.

Как можно увидеть в этот ответ на стекопоток

Первоначально эта строка генерировала исключение трансформатора:

        XPathExpression expr2 = xPath.compile("/DocDetails/" + x); 

Поскольку начинать с чисел запрещено, они, вероятно, читают его как недопустимый тег.

Что означает, что эта строка на самом деле читает "/ DocDetails /" вместо "/ DocDetails / 123" ИЛИ "/ DocDetails / 123abc",

вызывает дополнительный символ '/' в конце, следовательно, генерирует исключение трансформатора.

0 голосов
/ 13 марта 2019

Но если x в expr2 равно «123abc» ИЛИ «123», XPathExpression выбрасывает

Имя элемента XML не может начинаться с цифры.Следовательно, ваш пример эквивалентен

XPathExpression expr2 = xPath.compile("/DocDetails/123abc");

Я полагаю, парсер XPath этого не ожидает.

Вы также должны предоставить полный XML.Я считаю, что это, безусловно, не содержит ничего подобного <DocDetails><TransactionSignature>abc123</TransactionSignature><123abc>something</123abc></DocDetails>.Это просто неверный XML.

...