Я тестирую свое приложение и понял, что поведение при компиляции отличается.
Например, если мое выражение для компиляции:
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>