我知道这已被多次询问,但我有一个不同的问题来处理它。在我的例子中,应用程序接收到一个非格式良好的 dom 结构作为字符串传递。这是一个示例:
<div class='video yt'><div class='yt_url'>http://www.youtube.com/watch?v=U_QLu_Twd0g&feature=abcde_gdata</div></div>
如您所见,内容格式不正确。现在,如果我尝试使用普通的 SAX 或 DOM 解析器进行解析,它会抛出一个可以理解的异常。
org.xml.sax.SAXParseException:对实体“功能”的引用必须以“;”结尾 分隔符。
根据要求,我需要阅读此文档,添加一些额外的 div 标签并将内容作为字符串发送回。这通过使用 DOM 解析器非常有效,因为我可以读取输入结构并在所需位置添加额外的标签。
我尝试使用 JTidy 之类的工具进行预处理然后解析,但这会导致将文档转换为完整的 html,这是我不想要的。这是一个示例代码:
StringWriter writer = new StringWriter();
Tidy tidy = new Tidy(); // obtain a new Tidy instance
tidy.setXHTML(true);
tidy.parse(new ByteArrayInputStream(content.getBytes()), writer);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new ByteArrayInputStream(writer.toString().getBytes()));
// Traverse thru the content and add new tags
....
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
StreamResult result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
这将输入完全转换为格式良好的 html 文档。然后很难手动删除 html 标签。我尝试的另一个选项是使用 SAX2DOM,它也创建了一个 HTML 文档。这是一个示例代码。
ByteArrayInputStream is = new ByteArrayInputStream(content.getBytes());
Parser p = new Parser();
p.setFeature(IContentExtractionConstant.SAX_NAMESPACE,true);
SAX2DOM sax2dom = new SAX2DOM();
p.setContentHandler(sax2dom);
p.parse(new InputSource(is));
Document doc = (Document)sax2dom.getDOM();
如果有人可以分享他们的想法,我将不胜感激。
谢谢