【问题标题】:How to extract nodes with no immediate text after them with XPath 1.0?如何使用 XPath 1.0 提取没有直接文本的节点?
【发布时间】:2018-02-08 10:44:40
【问题描述】:

如何使用单个 XPath 1.0 表达式选择具有至少一个后续兄弟节点但在它们之后没有直接文本节点的某些节点?

例如,来自以下 XML:

<p>This is some <b>forma</b><b>tted</b> text, this is <b>bold</b>.</p>

我想提取第一个&lt;b&gt;标签。

到目前为止,我已经想出了以下表达式:

//b[following-sibling::*[1][self::b]][not(text() = following-sibling::text()[1]/preceding-sibling::*[1][self::b]/text())]

但是,它不会提取具有相同文本的标签,例如:

<p>I am hungry for <b>paw</b><b>paw</b>.</p>

有没有更好更简单的方法?

【问题讨论】:

  • 看来你的源代码是HTML,而不是XML,所以如果你设置正确的标签会更好。另请注意,带有p HTML 节点 might behave differently 的 XPath 比带有 XML 节点的 XPath
  • 不,它是 XML。部分来自更大的 XML 文件。 p 节点实际上并不重要,因为可能还有其他一些 XML 节点,例如 actionfoo-parp 这里只是一个例子。表达式应该从任何父节点中提取b
  • 这个 xpath 适用于两个示例 '//b[1]/text()' 尽管看起来过于简单。
  • @LuisMuñoz,这不起作用,因为 1)我需要找到几个 b 节点,而不是其中的文本,而不仅仅是第一个节点 2)这些只是示例,b节点可能以各种方式和位置出现,不一定是第一个,我寻求的表达式应该提取b标签,它完全满足我最开始提到的条件(第一句话)。
  • @Andersson:在引用的链接 (+1) 中,您对 HTML 中的 p 元素有深刻的观察,但在 Cuder 的案例中,标记是正常的混合内容和 able to be selected via XPath。跨度>

标签: xml xpath xpath-1.0


【解决方案1】:

这个 XPath,

//*[following-sibling::node()[1][not(self::text())]]

将选择具有紧随其后的非文本节点的兄弟的所有元素。

【讨论】:

    猜你喜欢
    • 2018-02-21
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多