【问题标题】:Ignoring / skipping known or all subordinated tags with XPath使用 XPath 忽略/跳过已知或所有从属标记
【发布时间】:2011-03-04 18:20:17
【问题描述】:

我正在使用 XPath 和 Hpple / libxml2 来解析 iOS / iPhone OS 中的 HTML。我现在想在解析文档时忽略某个标记,例如粗体标记<b>

例如来自代码

<div>foo<b>bar</b></div>

应选择字符串“foo”和“bar”并将其连接起来,生成“foobar”。

在查看相关请求后,我觉得他们可能无法解决此问题,但绝对有可能我错了。如果是这样,请让我知道并使用上面的示例举例说明。

谢谢。

【问题讨论】:

  • 好问题,+1。请参阅我的答案以获得完整、简短且简单的解决方案和解释。 :)
  • 我对你使用命名空间这个词有点困惑。 <b> 标签只是一个标签,在所使用的任何标记语言中都有特定的含义(在您的情况下可能是 XHTML)。命名空间确保来自多种标记语言的标签可以一起使用,而不会在语义上产生歧义。
  • @SnuggleUp:不恰当的术语使这个问题变得不清楚。
  • 哦,我真的很抱歉!事实上,我用了错误的术语来表达我的意思。实际上,我还不太关心 XML 或其他标记语言,只是当我像现在一样表面上需要它时。我已经更正了。
  • 跟进:“解析”一个 XML 文档将其变成一个节点树(元素节点、属性节点、文本节点等)。 XPath 表达式导航该节点树,选择其中的一些,或计算属性,例如它们的字符串值(在这种情况下,这是您想要的)。因此,您不使用 XPath 来解析 XML,而是使用 XPath 来查找解析后的 XML。原始 XML 包含标签,解析器使用这些标签来构造元素节点。例如元素节点b对应源XML中的两个标签,开始标签<b>和结束标签</b>

标签: xml xpath tags


【解决方案1】:

使用

string(/*)

根据提供的 XML 文档进行评估时

<div>foo<b>bar</b></div>

产生了想要的正确结果:

foobar

解释

根据XPath 1.0 W3C specification

"元素节点的字符串值是该元素节点的所有文本节点后代的字符串值按文档顺序串联"

【讨论】:

  • 非常感谢您的快速回复,我会尽快试用! ;)
  • 你能举个例子吗?我的意思是NSArray *googleDescriptions = [googleParser search:@"//div[@class='s']"]; 导致NSArray *googleDescriptions = [googleParser search:@"//div[@class='s'][string(/*)]"]; 它返回的表达式与 w\o 字符串函数的表达式相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2017-11-29
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 2018-11-26
相关资源
最近更新 更多