Выделите текст только в узле, а не в дочерних узлах. - PullRequest
39 голосов
/ 19 декабря 2010

Как получить текст в узле без выделения текста в дочерних элементах?

<div id="comment">
     <div class="title">Editor's Description</div>
     <div class="changed">Last updated: </div>
     <br class="clear">
     Lorem ipsum dolor sit amet.
</div>

Другими словами, я хочу Lorem ipsum dolor sit amet. вместо Editor's DescriptionLast updated: Lorem ipsum dolor sit amet.

Ответы [ 3 ]

41 голосов
/ 19 декабря 2010

В предоставленном XML-документе:

<div id="comment">
      <div class="title">Editor's Description</div>
      <div class="changed">Last updated: </div>
      <br class="clear">
      Lorem ipsum dolor sit amet. 
</div> 

верхний элемент /div имеет 4 дочерних узла, которые являются текстовыми узлами. Первые трое из этих четырех text-node детей - whitespace-only. Последний из этих 4 text-node детей - тот, который разыскивается.

Используйте :

/div/text()[last()]

Это отличается от :

/div/text()

Последний может (в зависимости от того, сохранены ли whitespace-only узлы анализатором XML) выбрать все 4 текстовых узла, но вам нужен только последний из них.

Альтернативой является (когда вы точно не знаете, какой text-node вы хотите):

/div/text()[normalize-space()]

Выбирает все text-node-children из /div, которые не являются whitespace-only текстовыми узлами.

13 голосов
/ 19 декабря 2010

Просто выберите text() вместо .:

div/text()

Для данного фрагмента XML это возвращает:

Lorem ipsum dolor sit amet.
0 голосов
/ 25 апреля 2017

Как насчет этого:
$doc/node()[3]/text()
Предположим, что $ doc содержит xml.

...