【问题标题】:Parsing / combining nested HTML element values in the original order按原始顺序解析/组合嵌套的 HTML 元素值
【发布时间】:2011-11-12 11:49:21
【问题描述】:

我想知道如何使用与 XPath 表达式一起使用的 this (Hpple) 包装器来解析 HTML 块的内容,同时保持字符串在 HTML 文档中出现的顺序。环境是iOS。

例子:

<html>
<body>
<div>
Lorem ipsum <a href="...">dolor</a> sit <b>amet,</b> consectetur
</div>
</body>
</html>

假设我们要按原始顺序解析&lt;div&gt;标签内的所有字符串,以便得到这个结果:

Lorem ipsum dolor sit amet, consectetur

这个问题的症结在于维持字符串的顺序。使用 XPath 表达式很容易获得 &lt;div&gt; 以及 &lt;a&gt;&lt;b&gt; 的所有直接内容,但忽略了顺序,因此可能会导致放入 @987654328 的内容@ 和 &lt;b&gt; 在字符串的末尾。

如何使用带有上述包装器的 XPath 表达式来实现这一点?

更新:

使用上述包装器和平台(尤其是 libxml2)实现此目的的一种方法似乎是以下 XPath 表达式:

//div/descendant-or-self::*/text()

但是,生成的元素是分开的,而不是作为一个字符串传递的,因此必须手动连接它们。

【问题讨论】:

  • 好问题,+1。请参阅我对一个 XPath 1.0 表达式的回答,该表达式可以准确生成所需的文本。

标签: iphone ios xpath html-parsing hpple


【解决方案1】:

如果 Hpple 是兼容的 XPath 引擎,那么它必须能够评估此表达式

string(/*/body/div)

此 XPath 表达式计算为第一个的字符串值(按文档顺序 /*/body/div 元素(在您的情况下只有一个这样的元素)。

根据定义,一个节点的 字符串值 是其所有后代文本节点的串联(按文档顺序),因此这个结果正是您请求的字符串。

基于 XSLT 的验证

这种转变

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:value-of select="/*/body/div"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时

<html>
    <body>
        <div> Lorem ipsum 
            <a href="...">dolor</a> sit 
            <b>amet,</b> consectetur 
        </div>
    </body>
</html>

产生想要的正确结果

 Lorem ipsum 
            dolor sit 
            amet, consectetur 

【讨论】:

  • 感谢您的出色回答。我确信 XPath 通常是正确的,但是我无法使用 Hpple 让它工作。我找到了另一种方法来实现这一点,我也会很快发布它。也许其他人知道 Hpple 中是否需要任何前缀等来识别字符串函数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多