org.w3c.dom.Document 打印无效的 XML 文件

我有一个org.w3c.dom.Document来自 HTML的 XML org.jsoup.nodes.Document

当我序列化 时org.w3c.dom.Document,它会生成一个无效的 XML 文件:它不会关闭META标记。

为什么?这是一个错误吗?从jsoup? 从爪哇org.w3c.dom?从javax.xml.transform.Transformer?

相关错误:

示例代码:

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


阿波罗的战车
浏览 187回答 3
3回答

慕莱坞森

(澄清了我对评论的回答;评论不再与当前形式的答案相关)。在 HTML 中,<meta>元素是自闭合的;没有结束标签。您已经构建了一个 DOM 文档,它是一个节点树,其中最顶部的节点是一个 HTML 元素。然后,您使用 JAXP 序列化程序序列化了 DOM 文档,而没有指定输出方法。默认输出方法取决于根元素,即 HTML,因此您将获得 HTML 序列化。HTML 序列化程序向输出添加一个未关闭的 META 标记。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java