我有一个org.w3c.dom.Document来自 HTML的 XML org.jsoup.nodes.Document。当我序列化 时org.w3c.dom.Document,它会生成一个无效的 XML 文件:它不会关闭META标记。为什么?这是一个错误吗?从jsoup? 从爪哇org.w3c.dom?从javax.xml.transform.Transformer?相关错误:W3CDom.fromJsoup fails when xmlns is defined https://github.com/jhy/jsoup/issues/1096应该org.jsoup.nodes.Document.toString()生成一个有效的 XML 文件吗? https://github.com/jhy/jsoup/issues/1097示例代码:import org.jsoup.Jsoup;import org.jsoup.helper.W3CDom;import org.w3c.dom.Document;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import java.io.ByteArrayInputStream;import java.io.StringWriter;import java.nio.charset.StandardCharsets;public class Test130e { public static void main(String[] args) throws Exception { String html = "<html><head><script async src=\"http://example.com/script.js\"></script></head></html>"; org.jsoup.nodes.Document jsoupDoc = Jsoup.parse(html); System.out.println("+++ jsoupDoc.toString()"); System.out.println(jsoupDoc.toString()); Document w3cDoc = new W3CDom().fromJsoup(jsoupDoc); String xml = w3cDocToString(w3cDoc); System.out.println("+++ xml"); System.out.println(xml); // this previous xml file is invalid, and so it fails to parse it // The element type "META" must be terminated by the matching end-tag "</META>". Document w3cDoc2 = parseXml(xml); } static Document parseXml(String content) throws Exception { DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); return documentBuilder.parse(new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))); }为什么会生成w3cDocToString无效的 XML 文件(它不会关闭META标记)?这是一个错误吗?从jsoup? 从爪哇org.w3c.dom?
3 回答
慕莱坞森
TA贡献1810条经验 获得超4个赞
(澄清了我对评论的回答;评论不再与当前形式的答案相关)。
在 HTML 中,<meta>
元素是自闭合的;没有结束标签。
您已经构建了一个 DOM 文档,它是一个节点树,其中最顶部的节点是一个 HTML 元素。
然后,您使用 JAXP 序列化程序序列化了 DOM 文档,而没有指定输出方法。默认输出方法取决于根元素,即 HTML,因此您将获得 HTML 序列化。HTML 序列化程序向输出添加一个未关闭的 META 标记。
添加回答
举报
0/150
提交
取消