Очистка экрана с помощью PHP и XPath - PullRequest
1 голос
/ 07 января 2009

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

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 07 января 2009

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

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

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

1 голос
/ 11 января 2009

Язык 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>
1 голос
/ 08 января 2009

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

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

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

И расширить на цитату

NodeValue элемента на самом деле является текстовым значением, а не структурированным 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.

0 голосов
/ 07 января 2009

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>
0 голосов
/ 07 января 2009

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

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

...