как использовать XPath для поиска значения узла с тегом CDATA в java

#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, которое состоит из конкатенации всех его дочерних текстовых узлов.