有谁知道在使用 XPath 提取数据时如何维护文本格式?
我目前正在提取所有块
<div class="info">
<h5>title</h5>
text <a href="somelink">anchor</a>
</div>
从一个页面。问题是当我访问 nodeValue 时,我只能得到纯文本。如何捕获包括格式在内的内容,即代码中的 h5 和静止图像?
提前致谢。我在谷歌上搜索了所有可以想象的组合,但没有运气。
有谁知道在使用 XPath 提取数据时如何维护文本格式?
我目前正在提取所有块
<div class="info">
<h5>title</h5>
text <a href="somelink">anchor</a>
</div>
从一个页面。问题是当我访问 nodeValue 时,我只能得到纯文本。如何捕获包括格式在内的内容,即代码中的 h5 和静止图像?
提前致谢。我在谷歌上搜索了所有可以想象的组合,但没有运气。
如果您将它作为 DomElement $element 作为 DomDocument $dom 的一部分,那么您将需要执行以下操作:
$string = $dom->saveXml($element);
元素的 NodeValue 实际上是文本值,而不是结构化的 XML。
我想添加到 Ciaran McNulty 的答案
您可以在 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
.
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>
您需要确保您的 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>