2012-06-05 7 views
29

У меня есть XPath, чтобы выбрать класс, который я хочу: //div[@class='myclass']. Но она возвращает мне все DIV (с <div class='myclass'> также, но я хотел бы вернуться только содержимое этого тега без самого тега. Как я могу это сделать?Как получить значение узла/innerHTML с помощью XPath?

ответ

30

С помощью xpath вещь, которую вы получите, является последней вещью на пути, которая не является условием. Что это значит? Ну, условия - это материал между [] (но вы уже это знали), а ваш читает как pathElement [, который имеет атрибут 'class' со значением 'my class']. hElement поставляется непосредственно перед [.

Весь материал за пределами []-х, тогда это путь, так что в //a/b/c[@blah='bleh']/d, б, с и д все элементы пути, бла является атрибутом и BLEH буквальное значение. Если этот путь соответствует этому, он вернет вам d, последний несобственный предмет.

Ваш конкретный путь возвращает (серия) div, являясь последним вещью в пути вашего xpath. Таким образом, это возвращаемое значение включает в себя узел (и) верхнего уровня, div в вашем случае, а под ним (их) все его дети. Узлами могут быть элементы или текст (или комментарии, инструкции по обработке, ...).

Под узлом могут быть несколько текстовых узлов, поэтому обсуждается массив pOcHa. x/text() возвращает весь текст, являющийся прямым дочерним элементом x, x/node() возвращает все дочерние узлы, включая текст.

Надеюсь, это поможет.

37
node() = innerXml 

text() = innerText 

как массивы, так текст () [1] - первый текстовый узел для детей ...

+0

Как будет выглядеть несколько текстовых узлов в XML? Будет ли text() возвращать конкатенацию всех внутренних тегов, которые являются дочерними элементами выбранного узла? – CoDEmanX

+1

@CoDEmanX: '

text1text2text3
' как я уже сказал, это ** массив **, поэтому 'div/node() [0] == div/text() [0] == text1' node и' div/node() [1] == span' node и 'div/node() [2] == div/text() [1] == text3' node - вам придется объединять их самостоятельно (вручную или с помощью вспомогательная функция, которая принимает массив). –

0

Вы можете попробовать

// DIV [@ класс = 'MyClass']/ребенка :: *

ребенок :: * выбирает все элементы, являющиеся детьми контекстного узла see details

2

Новый ответ на старый, часто задаваемый вопрос:

Для этого XML

<div class="myclass">content</div> 

вы можете использовать XPath для выбора в одном из двух способов просто content:

  1. Выбор текстового узла

    Это XPath,

    //div[@class='myclass']/text() 
    

    выберет дочерние узлы текстового узла целевого div, content, в соответствии с запросом.

  2. String Значение элемента

    Это XPath,

    string(//div[@class='myclass']) 
    

    возвратит string-value из целевого div элемента, content, опять же, как просили.

    Дополнительная информация: Вот note объяснения строковых значений элементов:

    string-value узла элемента является конкатенация string-value с всего текстового узла descendants элемента узел в заказе документа.

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