#java #xml #xpath
#java #xml #xpath
Вопрос:
Я использовал XPath для анализа XML-данных rss, и данные
<rss version="2.0">
<channel>
<title>
<![CDATA[sports news]]>
</title>
</channel>
</rss>
Я хочу получить текст «новости спорта», используя xpath «/rss / channel / title / text()» , но результат не тот, который я хочу, реальный результат » r n», так как же найти результат, который я хочу.
код приведен ниже:
Документ doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(есть); XPathFactory XPathFactory = XPathFactory.newInstance(); XPath XPath = XPathFactory.newXPath(); Узел узел = (Node) XPath.evaluate("/rss/канал /заголовок /текст()", doc,XPathConstants.NODE); Заголовок строки = node.getNodeValue();
Ответ №1:
Попробуйте вызвать setCoalescing(true) в вашем DocumentBuilderFactory, и это свернет все узлы CDATA / text в отдельные узлы.
Комментарии:
1. или передайте XPathConstants.NODESET и назначьте evaluate списку узлов. Но объединение — это более простая вещь.
2. Официально, в модели данных XPath текстовые узлы никогда не разбиваются на части, поэтому ваш запрос должен возвращать ожидаемый результат. На практике некоторым реализациям XPath, которые работают с DOM, не удастся объединить смежные текстовые узлы. Одно из решений состоит в том, чтобы избежать использования text() (вместо этого используйте string() для элемента); другое — использовать setCoalescing(), как предложено; третье — использовать соответствующий процессор XPath, такой как Saxon.
Ответ №2:
Вы могли бы попробовать изменить выражение XPath на
"string(/rss/channel/title)"
и используйте возвращаемый тип STRING вместо NODE:
Node node = (Node) xPath.evaluate("string(/rss/channel/title)", doc,
XPathConstants.STRING);
Таким образом, вы выбираете не текстовый узел, а скорее строковое значение элемента title, которое состоит из конкатенации всех его дочерних текстовых узлов.