2012-01-14 3 views
0

Я хотел бы извлечь весь текст из подносов конкретного документа и вернуть текстовый массив. Я думаю, было бы легче показать это на примере:Извлечение и группировка всех текстовых узлов с использованием Xpath 2.0

данного документа:

<root> 
    <div> 
     some text 
     <p>some other text</p> 
    </div> 

    <div> 
     another text 
     <b>yet another text <em>even more</em></b> 
     end of text 
    </div> 
</root> 

Я хотел бы построить выражение, которое возвращает два элемента:

[0] some text someother text 
[1] another text yet another text even more end of text 

Я пытался много но мне кажется, что здесь что-то не хватает, легко извлечь div только (просто // div), но как сгруппировать их и объединить все текстовые() подноды в каждом div отдельно?

ответ

1

text() ваш друг здесь:

Вы должны сделать это в два этапа.

//div 

затем:

//text() 

А потом программно объединить их.

XPath - это язык запросов, как и селектор CSS, и не может преобразовать вещи. Все функции (например, normalize-text) предназначены для уточнения вашего селектора, чтобы не изменять сам вход.

См: how to get the normalize-space() xpath function to work?

+0

Nope. // div/text() вернет больше узлов, поскольку первый div имеет как минимум 1 текстовый узел, а второй имеет как минимум 2 текстовых узла. // div // text() вернет еще больше узлов. Выражение, которое я ищу, должно включать все узлы text() в каждом div отдельно. Что-то вроде // div/concat (.// text()), но это не работает, конечно. – Pma

+0

Также я использую чистую XPATH в приложении java, я не могу выполнить постпроцесс с использованием XSLT, поэтому я ищу идеальное решение XPATH. – Pma

+0

Здесь нет чистых решений XPath. Извините. Подумайте о XPath как о селекторах CSS ... они - селекторы, а не трансформаторы. – greut

1

с XPath 2.0 (и предполагается, что ваш вход хорошо сформированным с некоторыми добавил </b>), вы можете использовать этот путь /root/div/normalize-space() который дает последовательность из двух строк «какой-то текст какой-либо другой текст» и «еще один текст еще один текст еще больше конца текста».

+0

Я пробовал использовать это выражение в тестовом java-приложении с Saxon 9. К сожалению, есть проблема с настройкой returnType. из метода оценки(). Если я задал тип XpathConstants.STRING, я получаю только первое значение String «какой-то текстовый другой текст», я думаю, что выражение должно работать. Но как пометить возвращаемый тип как «String array»? Тип возвращаемого значения XpathConstants.NODESET не работает, поскольку мы имеем дело с узлами String ... – Pma

+0

'normalize-space() '- функция, а не селектор. – greut

+0

Проблема с типом возврата заключается в том, что вы используете JAXP API, который никогда не был расширен для XPath 2.0, поэтому он не позволяет вам запрашивать результат, содержащий последовательность строк. Вместо этого используйте Saxon s9api. –

0

XPath не может создавать новые узлы: для этого вам нужны XSLT или XQuery. Таким образом, выражение никогда не сможет вернуть элемент, который отсутствует в исходном документе. Однако с XPath 2.0 вы можете легко получить две строки: за исключением мелких деталей пробела, вы можете получить требуемый результат из выражения //div/normalize-space(.)

Смежные вопросы