Использование XPath для получения текста внутри родительского узла

#xml #xpath

#xml #xpath

Вопрос:

например, я получаю строку html следующим образом:

 <p><br><a href="http://www.hello.com/en/">www.hello.com</a></p>
 

И я хочу получить такой результат:

 <br><a href="http://www.hello.com/en/">www.hello.com</a>
 

Но я, наконец, получаю «www.hello.com » при использовании инструкции XPath

 //p/text()
 

есть идеи?

Ответ №1:

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

 //p
 

Он выбирает p элемент.

Комментарии:

1. результат по-прежнему «www.hello.com » с помощью «//p» я хочу, чтобы узлы <br> и <a> были в строке результата.

2. @MaS, это зависит от того, как вы используете его в своем движке XPath.

3. @MaS, //p выберет любой элемент p в документе

4. Я не знаю о движке XPath, можете ли вы привести мне пример для этого случая?

5. Как я могу получить символы между <p> и </p> ?

Ответ №2:

 But I finally get "www.hello.com" when using the the XPath statement 

    //p/text() 
 

При этом выбирается любой текстовый узел, который является дочерним элементом p элемента в документе.

Однако вам нужны не только дочерние элементы текстового узла, но и любые дочерние элементы, включая элементы, такие как <br> и <a> .

Решение:

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

 /p/node()
 

когда это выражение XPath вычисляется по предоставленному XML (исправлено, чтобы сделать правильно сформированный XML-документ):

 <p><br/><a href="http://www.hello.com/en/">www.hello.com</a></p>
 

выбираются следующие два узла:

 <br/><a href="http://www.hello.com/en/">www.hello.com</a>
 

Проверка на основе XSLT:

Это преобразование:

 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select="/p/node()"/>
 </xsl:template>
</xsl:stylesheet>
 

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

 <p><br/><a href="http://www.hello.com/en/">www.hello.com</a></p>
 

копирует выбранные узлы в выходные данные:

 <br/><a href="http://www.hello.com/en/">www.hello.com</a>
 

Ответ №3:

 /p/*
 

Извлекает все элементы, которые являются дочерними элементами элемента p. Это то, что вы хотите.

Предупреждение. Ваш элемент <br> неправильно сформирован. Вы должны закрыть его, чтобы он мог быть правильно сформированным пустым элементом <br/>

Комментарии:

1. /p/node() возвращает тот же результат «www.hello.com »

2. Я не знаю, какой движок XPath вы используете. Но если вы сделаете xmllint —xpath ‘/p/node()’ file.xml — с помощью file.xml содержащий вашу строку — вывод <br><a href=» hello.com/en «>www.hello.com </a>. Я проверил это перед публикацией.

3. Как вы выполняете свои запросы XPath?

4. Я запускаю его в IOS с помощью libxml2 и библиотеки hpple