我需要解析HTML文档而不是修改它并保存它。问题是我只想更改特定元素,文档的其余部分应该保持与开头一样。许多像JSoup这样的库在解析过程中会自动修复和改进HTML,我不想这样做。你知道任何没有这种功能或有可能禁用它的库吗?理想情况下,解析方法应该尝试解析HTML文档,当出现错误时,应该引发异常。
任何帮助?
答案 0 :(得分:1)
一种选择是使用JDK原生DOM支持。 您可以解析HTML文件以获取DOM对象。然后修改DOM对象(最终使用XPath检索要修改的元素)。最后,将DOM对象序列化为HTML。
要解析HTML文档,您可能需要以下内容:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document dom = docBuilder.parse(new InputSource(new FileReader(htmlFile)));
检查Document,DocumentBuilder和DocumentBuilderFactory文档以正确配置HTML解析:
http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Document.html http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilder.html http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilderFactory.html
然后使用dom修改所需的所有元素,并在编写类似于以下内容的情况下将其序列化为HTML文档:
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
DOMSource source = new DOMSource(document);
FileWriter writer = new FileWriter(htmlFile);
transformer.transform(source, new StreamResult(writer));
答案 1 :(得分:1)
如果你想保持HTML源的确切含义(包括空格,注释,格式不良的XML和换行等),那么我很确定你唯一的选择是查找和替换。您可能会发现您可以使用正则表达式和一些capturing groups来解决问题,而无需实际解析HTML。
所有其他解决方案(我能想到)会将HTML解析为某种形式的DOM并丢失空格/换行符和可能的评论等。最后,您将把DOM转换回HTML字符串但很可能会丢失一些原始格式。根据DOM实现,您甚至可能会发现属性的顺序已更改(很可能是由于使用了java.util.HashMap
)。
所有DOM解析解决方案(我能想到)都要求您的HTML是正确形成的XML。更宽松的解析器将“修复”HTML,以便正确形成XML。