Экстракт XQuery между двумя тегами
-
29-09-2019 - |
Вопрос
В настоящее время я работаю над извлечением данных из HTML
. Отказ Я хотел бы извлечь текст между двумя <p class="xfHeading">
Теги.
<p class="xfHeading"><b>XYZ:</b></p>
<p>asdfghjk</p>
<p>sdsdsd</p>
<p>asdvcvcfghjk</p>
<p class="xfHeading"><b>ABC:</b></p>
<P>fvgbhnjm</P>
<p class="xfHeading"><b>PQR:</b></p>
<ul>
</ul>
<p class="xfHeading"><b>MNO:</b></p>
<ul>
<li>jdjshdj</li>
</ul>
То выход должно быть :
asdfghjk.
sdsdsd.
ASDVCVCFGHKJK
Один из способов сделать это:
/p[class="xfHeading"]/following-sibling::p[0]|/p[class="xfHeading"]/following-sibling::p[1]|/p[class="xfHeading"]/following-sibling::p[2]
или
/p[class="xfHeading"]/following-sibling::p[position()<4]
Однако, поскольку содержание между продолжающимися изменением все время мне нужно решение, в котором содержание между двумя тегами <p class="xfHeading">
извлекается.
Решение
Использовать:
(//p[@class="xfHeading"])[1]
/following-sibling::p
[. << (//p[@class="xfHeading"])[2]]
/text()
Это означает: Выберите текстовый узел детей всех p
Элементы, которые следуют братьям и сестрами первого p
элемент в документе с class
атрибут имеет значение xfHeading
, и что в то же время предшествуют второму p
элемент в документе с class
атрибут имеет значение xfHeading
.
Другие советы
РЕДАКТИРОВАТЬ: После вашего разъяснения мое предложение - использовать Флюс выражение, такое как следующее. Это ищет <p>
с правильным <b>
содержимое метки на основе уникального содержимого этого <b>
тег и возвращает текст каждого <p>
Тег, который является родным братом.
for $b in //p[class="xfHeading"]/b and $p in //p[class="xfHeading"]/p
where $b/text() = "XYZ:"
return p/text()
Обратите внимание, что то //
это конструкция XPath, а не комментарий
Старый ответ: Без примера того, что вы хотели бы в результате возможные данные, отвечая на вопрос, немного жестко. Однако для выбора, например, текст внутри <b>
Теги, вы сделаете:
/p[class = "xfHeading"]/b/text()
В общем, добавление text()
К концу выражения возвращает текст внутри узела.