修复未闭合的HTML标签或使用HTML解析器进行XSLT转换

5
我有一些HTML代码,是通过XSLT转换(XML->HTML)得到的。
我想在结果HTML上运行另一个XSLT转换(HTML->HTML)。
我的问题是,第一个转换可能会返回未关闭的标签,比如 "",这意味着我无法使用DocumentBuilder解析结果HTML,因为它使用SAXparser,当然我的HTML文件并不总是有效的XML。 (我会得到一个异常,指出以下XY标签必须关闭。)
我想有两种解决方案。
要么修复结果HTML,关闭未关闭的标签。
要么使用某种HTML解析器获取有效的org.w3c.dom.Document,并跳过像SAX这样的XML解析器。
我真的很想主要使用我用于第一个转换的相同方法,所以我更喜欢上述解决方案之一。问题是我找不到任何明显的第三方jar包可以帮助我。(虽然我已经搜索了。)所以基本上我想知道我的选择是什么,有没有解决这个问题的办法?
非常感谢您的任何帮助。

http://jtidy.sourceforge.net/ 可能会对您有所帮助。 - gaborsch
HTML5 推荐的方法是选项2。你很幸运。Java 中有许多免费的 HTML 解析器,大多数都会创建与 org.w3c.dom.Document 兼容的 DOM。 - Alohci
感谢大家的帮助,我测试了几乎所有的建议,它们都似乎是可行的。最终我使用了nu.validator.htmlparser.dom.HtmlDocumentBuilder类,它非常好用。再次感谢。 - Peter Jaloveczki
3个回答

6
你需要的是 Jsoup : Java HTML Parser。它具有输出整洁 HTML 的功能。
String html = "<p>The recurrence, in close succession <ul><li>list item 1</li><li>list item 2</li></ul> second part of thisssss";
String clean = Jsoup.clean(html, Whitelist.relaxed());

您还可以使用其他白名单


可以,但需要两次解析和一次序列化才能将数据传递到XSLT转换中。应该可以通过单次解析来实现相同的效果。Jsoup可能可以做到这一点,但我不熟悉Jsoup,其他一些Java HTML解析器肯定可以。 - Alohci
@Alohci,我认为无论你使用什么解析器,但你肯定需要一个解析器来修复HTML。 - kaysush
1
一个好的基于Java的HTML解析器可以直接将糟糕的标记转换为与org.w3c.dom.Document兼容的DOM,只需要一次解析(就像浏览器一样)。validator.nu HTML解析器就是其中之一,并且我相信其他流行的解析器也能做到。 - Alohci
@kaysush的解决方案对我有用,但在某些情况下会删除一些表格标签。 - Fernando Pie
我正在使用Jsoup,我有一个<p> <img alt="" src="img64BEncode"></p>,通过jsoup解析成了这个:<p> <img alt=""></p>。这里有什么问题吗? - Fernando Pie

4

alt textTagSoup - Just Keep On Truckin'alt text

你可以使用TagSoup来确保所有文档都是格式良好的。

...这是一个用Java编写的SAX兼容解析器,不是解析格式良好或有效的XML,而是解析在野外发现的HTML:糟糕、肮脏和残酷,但往往远非简短。

TagSoup 的设计是为那些必须使用某种合理应用设计来处理此类内容的人而设计的。

通过提供 SAX 接口,它允许标准 XML 工具被应用于即使是最糟糕的 HTML。TagSoup 还包括一个命令行处理器,它读取 HTML 文件并可以生成干净的 HTML 或接近 XHTML 的格式良好的 XML。

如果您正在使用 Saxon,您可以通过添加以下选项将 TagSoup 作为您的解析器

...您可以使用标准的 Saxon -x org.ccil.cowan.tagsoup.Parser 选项,但请确保在您的 Java 类路径中有 TagSoup。

我已经使用它来解析和转换 HTML 文档,并发现它非常好用。它会将文档读取为格式良好的 XHTML 文档,可通过 XML 工具进行操作和转换。

此外,现在还提供了 C++ 版本的 TagSoup:Taggle


链接已经断开! - Fernando Pie

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接