Во-первых, ваше выражение XPath содержит ошибку; subjectOf
повторяется без необходимости:
/subjectOf/subjectOf
Теперь, если вам действительно нужна ссылка на узел code
, который предшествует целевому элементу text
, тогда используйте следующее:
XPathExpression expr = xpath.compile(
"/testCodeIdentifier/subjectOf/annotation/code[@code='SPECIALNOTE']");
Node node = (Node) expr.evaluate(doc, XPathConstants.NODE);
System.out.println(getNextElementSibling(node).getTextContent());
Где getNextElementSibling
определяется следующим образом:
public static Node getNextElementSibling(Node node) {
Node next = node;
do {
next = next.getNextSibling();
} while ((next != null) && (next.getNodeType() != Node.ELEMENT_NODE));
return next;
}
Пара замечаний по этому поводу:
- Причина, по которой
getNextSibling
изначально не работал для вас, заключается (скорее всего) в том, что следующий родственный элемент указанного элемента code
- это текстовый узел, а не узел элемента. (Пробелы между code
и text
значительны.) Вот почему нам нужно getNextElementSibling
.
- Мы выбираем один узел, поэтому вместо него используем
XPathConstants.NODE
, если XPathConstants.NODELIST
Обратите внимание, что вам, вероятно, следует просто сделать так, как предлагает @Lukas, и изменить свое выражение XPath для непосредственного выделения целевого текста.
Вот как получить текст напрямую (в виде строки):
XPathExpression expr = xpath.compile(
"/testCodeIdentifier/subjectOf/annotation[code/@code='SPECIALNOTE']/text/text()");
String text = (String) expr.evaluate(doc, XPathConstants.STRING);
System.out.println(text);
Вот как сначала получить ссылку на элемент, а затем извлечь содержимое его раздела CDATA:
XPathExpression expr = xpath.compile(
"/testCodeIdentifier/subjectOf/annotation[code/@code='SPECIALNOTE']/text");
Node text = (Node) expr.evaluate(doc, XPathConstants.NODE);
System.out.println(text.getTextContent());