我有很多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,我不介意它们无效。
答案 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();