【问题标题】:Selecting blockquote after specific span with Xpath使用 Xpath 在特定跨度后选择块引用
【发布时间】:2011-06-29 16:47:33
【问题描述】:

所以,目前我正在使用 Xpath 从块引用标签中检索文本,但我需要能够选择特定的块引用。 我需要的两种类型之间的唯一区别是它们直接位于跨度之后。 假设我需要互相获取 text1 和 text2,这将是 HTML:

<span id="1">some code here</span>
<blockquote>text1</blockquote>

more code in here

<span id="2">some code here</span>
<blockquote>text</blockquote>

我该怎么做呢?

【问题讨论】:

  • 顺便说一句,我目前正在使用“//blockquote/node()”来获取文本。
  • +1 好问题。下次确保添加所有必要的详细信息。
  • 我会一直待到-1。之后我会删除我的问题。

标签: iphone objective-c xml xpath


【解决方案1】:

假设我们有这个 XML:

<root>
<span id="1 nothread">some code here</span>
<blockquote>text1</blockquote>

more code in here

<span id="2 nothread">some code here</span>
<blockquote>text</blockquote>

<span id="3">some code here</span>
<blockquote>text</blockquote>

<blockquote>not selected text</blockquote>
</root>

所以,这个 XPath://blockquote[local-name(preceding::*[1]) = 'span' and contains(preceding::*[1]/@id, 'nothread')]/node() 选择所有 blockquote,如果它直接在 span 之后并且 span/@id 包含 nothread。 结果:

  1. 文本1
  2. 文字

所以你看,not selected text 没有被选中

【讨论】:

  • 谢谢,但我需要分别获取 text1 和 text。按跨度 ID。我需要检查 span id 是否包含“nothread”(忘记在我的帖子中提及这部分,抱歉),如果是,请从后面的块引用中获取文本。你明白我的意思吗?
  • @polishchuck:不幸的是,这不起作用,我不知道为什么。即使只是使用 "//blockquote[local-name(preceding::*[1]) = 'span']/node()" 也不会出于某种原因。
  • 忽略我的上一篇文章,使用previous::*[5] 代替。我忘了提到跨度里面有标签。非常感谢!
  • 好吧,伙计们,我知道这不是一个好的建议!! @polishchuk 反正对你有好处,甚至更好:D
【解决方案2】:

我会使用:

//span[starts-with(@id,'nothread')]/following::*[1][name()='blockquote']

这将获得所有想要的块引用元素。

获取文本节点:

//span[starts-with(@id,'nothread')]/following::*[1][name()='blockquote']/text()

【讨论】:

  • 谢谢!这很好用,并且比其他答案更具可读性。我可以将它们都设置为正确答案吗?..
  • 不客气。你可以不接受前一个而接受这个。
  • 不要以为@polishchuk 会关心。他获得了 3 个赞成票,实际上他的 XPath 变得有点复杂。
  • @polishchuk 我知道这很烦人 :) 它有时发生在我身上,最糟糕的是没有任何有意义的解释 :((
猜你喜欢
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
相关资源
最近更新 更多