将xml字符串传输到org.w3c.dom.Document时忽略org.xml.sax.SAXParseExceptions?

时间:2013-05-04 14:24:01

标签: java html xml dom saxparser

我有很多html页面(我的意思是它的源代码),表示Java中的字符串java.Util.List。我需要将它转换为Java中的Document对象(来自包org.w3c.dom)。

我用DocumentBuilderFactory和Document:

这样做
public static org.w3c.dom.Document inputStream2Document(InputStream inputStream) throws IOException, SAXException, ParserConfigurationException {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setValidating(false);
    org.w3c.dom.Document parse = dbf.newDocumentBuilder().parse(inputStream);
    return parse;
}   

有些页面以正确的方式进行了转换,但是存在一个问题,即有一些其他页面具有例如错误的书写属性而且它无效(没有=“”的属性......所以它看起来像

<a href="somepage.html" someattr>

错误的书面属性称为“someattr”)。在这种情况下,我得到例外,例如

Nested exception: org.xml.sax.SAXParseException; lineNumber: 7558; columnNumber: 71; Element type "a" must be followed by either attribute specifications, ">" or "/>".

Nested exception: org.xml.sax.SAXParseException; lineNumber: 109; columnNumber: 32; The string "--" is not permitted within comments.

有没有办法对DocumentBuilderFactory说他应该忽略这些异常?我也希望将这些页面转换为Document,我不介意它们无效。

2 个答案:

答案 0 :(得分:1)

XML解析器只能解析格式良好的XML(或者,它是相同的,XHTML)。提供错误的页面格式不正确,即它们不是XML,因此XML解析器根本就不合适。

但是,如果唯一的问题是没有值的此类属性的存在,您可以尝试预处理输入文件以使用正则表达式删除这些属性。

答案 1 :(得分:1)

<a href="somepage.html" someattr>不是XML,因此XML解析器永远无法解析它,但它确实看起来像合理的 HTML ,因此您可以尝试使用HTML解析器,例如{{3而不是XML解析器。 NekoHTML的NekoHTML上有很好的例子,展示了如何将完整的文档和HTML片段解析为DOM节点。

import org.cyberneko.html.parsers.DOMParser;
import org.xml.sax.InputSource;
import org.w3c.dom.Document;
import java.io.StringReader;

DOMParser parser = new DOMParser();
InputSource in = new InputSource(new StringReader(theHtmlString));
parser.parse(in);
Document doc = parser.getDocument();