Очистка экрана с помощью PHP и XPath

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

Сейчас я извлекаю все блоки

<div class = "info"> <h5>title</h5> text <a href = "somelink">anchor</a> </div>

со страницы. Проблема в том, что когда я обращаюсь к nodeValue, я могу получить только простой текст. Как я могу записать содержимое, включая форматирование, то есть h5 и все еще в коде?

Заранее спасибо. Я искал все возможные комбинации в Google, и безуспешно.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
2 277
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Если у вас есть элемент DomElement $ как часть DomDocument $ dom, вам нужно сделать что-то вроде:

$string = $dom->saveXml($element);

NodeValue элемента - это действительно текстовое значение, а не структурированный XML.

Вам нужно убедиться, что ваш xpath-запрос «заканчивается» на <div class = "info">. Однако из-за того, как работает XPath, вы все равно получите все «вложенные теги» в отдельных узлах. Вам просто нужно объединить их.

Вы также можете использовать функциональность XPath присоединиться, хотя, поскольку я ее не использовал, я не могу сказать, с какими проблемами вы можете столкнуться.

div/node() должен помочь.

Пример ввода:

<div class = "info">
  some <h5>title</h5> text <a href = "somelink">anchor</a> more text
</div>

Пример таблицы стилей XSLT:

<?xml version = "1.0" encoding = "utf-8"?>
<xsl:stylesheet version = "2.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">

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

</xsl:stylesheet>

Пример вывода:

<?xml version = "1.0" encoding = "utf-8"?>
<newtag> some<h5>title</h5> text <a href = "somelink">anchor</a> more text</newtag>

Я хотел бы добавить к ответу Кьярана МакНалти

Вы можете сделать то же самое в SimpleXml, например:

$simplexml->node->asXml(); // saveXml() is now an alias

И чтобы расширить цитату

The NodeValue of an element is really the textual value, not the structured XML.

Вы можете думать о своем узле следующим образом:

<div class = "info">
    <__toString()> </__toString()>
    <h5>title</h5>
    <__toString()> text </__toString()>
    <a href = "somelink">anchor</a>
    <__toString()> </__toString()>
</div>

Если вызов $element->nodeValue аналогичен вызову $element->__toString(), который получит только элементы __toString (). Созданный мною воображаемый __toString() официально определен как XML_TEXT_NODE.

Язык XPath предназначен для встраивания в другой язык (например, DOM API, XSLT, XQuery, ...) и не может использоваться отдельно.. В исходном вопросе не указывается, какое встраивание желаемое.

Ниже приведено очень простое и короткое решение, когда XPath встроен в XSLT..

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

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

    <xsl:template match = "div[@class='info']">
       <xsl:copy-of select = "."/>
    </xsl:template>
</xsl:stylesheet>

при применении к этому XML-документу:

<html>
    <body>
        <div class = "info">
            <h1>title1</h1> text1
            <a href = "somelink1">anchor1</a>
        </div>
        Something else here
        <div class = "info">
            <h2>title2</h2> text2
            <a href = "somelink2">anchor2</a>
        </div>
        Something else here
        <div class = "info">
            <h3>title3</h3> text3
            <a href = "somelink3">anchor3</a>
        </div>
    </body>
</html>

дает желаемый результат:

<div class = "info">
  <h1>title1</h1> text1
    <a href = "somelink1">anchor1</a>
</div>
        Something else here
<div class = "info">
  <h2>title2</h2> text2
  <a href = "somelink2">anchor2</a>
</div>
        Something else here
<div class = "info">
  <h3>title3</h3> text3
  <a href = "somelink3">anchor3</a>
</div>

Другие вопросы по теме