Кто-нибудь знает, как сохранить форматирование текста при использовании XPath для извлечения данных?
Сейчас я извлекаю все блоки
<div class = "info">
<h5>title</h5>
text <a href = "somelink">anchor</a>
</div>
со страницы. Проблема в том, что когда я обращаюсь к nodeValue, я могу получить только простой текст. Как я могу записать содержимое, включая форматирование, то есть h5 и все еще в коде?
Заранее спасибо. Я искал все возможные комбинации в Google, и безуспешно.






Если у вас есть элемент 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>