使用XPath标记和未标记数据

时间:2011-08-20 22:58:14

标签: java xpath

我正在尝试使用Java中的XPath解析一些HTML。考虑一下这个HTML:

    <td class="postbody"> 
        <img src="...""><br />
<br />
<b>What is Blah?</b><br />
<br />
Blah blah blah
<br />

请注意,“什么是Blah”有助于包含在b标记中,因此很容易解析。但是“Blah blah blah”是公开的,因此我只能通过在其父节点上调用text()来获取它。

事情是,我需要按顺序执行此操作,将img放下,然后是粗体文本,然后是正文。重要的是它按顺序结束(如果你可以建议一种需要两次通过的方法,它不需要按顺序处理。)

那么有什么建议可以解决如果我在Java XPath节点中包含上述内容,我可以依次查看它并得到我需要的内容吗?

2 个答案:

答案 0 :(得分:1)

我认为基于SAX的解析器将是解决此问题的更好工具。它是基于事件的,因此您可以按顺序解析XML文档。

但它是一个XML解析器,因此您需要拥有一个有效的XML文档。我从未使用JTidy,但它是HTML Tidy的java端口,所以希望它可以帮助您将(无效的)HTML文档转换为有效的XML。

答案 1 :(得分:1)

将此XPath表达式与提供的XML片段的父级一起使用作为上下文节点进行评估:

node()

这将选择每个节点 - 上下文节点的子节点 - 每个元素-child,每个text-node-child,每个comment-child和每个PI(处理指令)-child。

如果您要排除评论和效果指标,请使用

node()[not(self::comment() or self::processing-instruction)]

如果除此之外您不想选择仅空白文本节点,请使用

node()
  [not(self::comment() or self::processing-instruction)]
    [not(self::text()[string-length() = 0])]