有没有人知道在使用XPath提取数据时如何维护文本格式?

我目前正在提取所有块

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

来自一个页面。问题是当我访问nodeValue时,我只能获得纯文本。如何捕获内容,包括格式化,即h5和代码中的静止?

提前致谢。我搜索了Google上可以想象的每一个组合,但没有运气。

有帮助吗?

解决方案

如果你将它作为DomDlement $元素作为DomDlement $元素的一部分,那么你将需要做类似的事情:

$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,...)并且不能单独使用。原始问题没有说明所需的嵌入是什么。

XSLT 中嵌入XPath时,以下是一个非常简单而简短的解决方案

此转化

<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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top