有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

有没有一种不用添加默认编码就可以在Java中解析XML的简单方法?

我有一些代码,它读取XML文件,格式化它,然后再次输出到同一个文件。但是,如果没有定义编码,则输出XML已定义UTF-8

例如:

<?xml version="1.0"?>

变成:

<?xml version="1.0" encoding="UTF-8"?>

我想知道是否有任何方法可以保留以前存在的任何编码(或缺少编码)

这是我目前的代码:

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document document = docBuilder.parse(file);

OutputFormat format = new OutputFormat(document);
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);

Writer out = new StringWriter();
XMLSerializer serializer = new XMLSerializer(out, format);
serializer.serialize(document);

//custom method to write file
writeFile(filePath, out.toString());

感谢您的帮助。谢谢


共 (3) 个答案

  1. # 1 楼答案

    OutputFormat有一个setEncoding(String)方法。这样使用:

    format.setEncoding(document.getXmlEncoding());
    

    这将在输出文档前言中保留文档的原始编码。但是,如果文档的原始编码未设置,文档将被删除。getXmlEncoding()返回null,并且OutpoutFormat.setEncoding(String)的Javadoc没有指定给定null时方法的行为

    当然,写入文件的自定义方法需要将编码作为参数,因为在前导中指定编码并在写入文件时使用另一种编码是非法的

    另外,在XML中,UTF-8编码是默认的。因此,在前导中省略编码或指定UTF-8具有相同的含义

  2. # 2 楼答案

    默认情况下,创建StreamWriter是为了使用不带前导的UTF-8。详见here

  3. # 3 楼答案

    可以使用Document.getEncoding并将其作为构造函数参数传递给OutputFormat类的重载构造函数