如何使用XML作为Java的模板来读取HTML?

时间:2012-11-08 23:18:02

标签: java html xml templates

我有一个Java应用程序,它将解析html页面并从中提取数据。目前,我有一个类作为模板或如何阅读特定网页的说明。应用程序需要从几个不同的格式中读取不同的格式。我希望能够读取随附的XML文件(或其他文档),而不是为每种类型的格式创建新的模板类,该文件将提供有关哪些数据和提取位置的说明。

我试图在网上搜索如何做到这一点,但我猜我没有问正确的问题或使用正确的关键字。

解决方案不必使用XML作为模板,但这是我第一次想到的。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

您可以保留xpath表达式,而不是在xml中使用模板,这些表达式会映射到您正在阅读的每个网站所需的数据。然后,当您正在更改的页面进行更改时,您可以更新该站点的xpath表达式。

答案 1 :(得分:0)

我之前实际上已经做过类似的事情,但它相当复杂。基本上我制作了一个插件系统(令人厌恶的像Maven),你可以参数化提取插件。

您可以使用Spring Bean XML作为DSL。

<bean id="strategy1"  class="absolute.class.name">
</bean>

<bean id="extractorExecutor" class="class.to.extractorExecutor">
   <property name="strategies">
    <list>
        <item ref="strategy1" />
        <item ref="strategy2" />
     </list>
    </property> 
</bean>

你的提取器基本上遍历了一堆实现如下界面的bean:

public interface ExtractStrategy {
    /**
     * null means skip this extractor and go to the next one.
     */
    public Extracted extract(String data);
}

在您的提取器中,您可以:

for (ExtractorStrategy e : strategies) {
    Extracted ex = e.extract(data);
    if (ex != null) break;
}

Spring称之为解析器链模式,有些人称之为策略模式。

然后你可以制作像@digitaljoel所说的XPath提取器和/或Regex Extractor ......等等。 您按照您希望它们运行的​​顺序放置策略。

我在需要启发式的时候一直使用这种模式。为了提取令人讨厌的HTML(在其他人的评论中提到),我建议JerichoJSoup(在这种情况下,你制定一个杰里科策略并添加到链中)。