【问题标题】:Is there an easy way to parse XML in Java without adding default encoding?有没有一种简单的方法可以在不添加默认编码的情况下在 Java 中解析 XML?
【发布时间】:2013-10-03 10:01:12
【问题描述】:

我有一些代码读取 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());

感谢任何帮助。谢谢。

【问题讨论】:

    标签: java xml encoding


    【解决方案1】:

    OutputFormat 有一个setEncoding(String) 方法。以这种方式使用它:

    format.setEncoding(document.getXmlEncoding());
    

    这将在输出文档序言中保留文档的原始编码。但是,如果未设置文档的原始编码,则 document.getXmlEncoding() 返回 null 并且 OutpoutFormat.setEncoding(String) 的 Javadoc 不会指定在给定 null 时该方法的行为方式。

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

    附带说明,在 XML 中,UTF-8 编码是默认的。所以省略序言中的编码或者指定UTF-8的含义是一样的。

    【讨论】:

    • 这非常有效。如果我定义了编码,它会接受它并输出那个确切的编码;如果我不定义它不会输出默认值。感谢您的详细解释。这是一个很大的帮助。此外,我将为 XML 使用一些自定义解释器,并且我遇到了一些地方,它以不同的方式处理指定编码和编码不明确的文件。因此,在格式化时,我想让它们保持原样。再次感谢!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      默认情况下,StreamWriter 是为使用 UTF-8 而创建的,没有前导码。查看详情here

      【讨论】:

      • 不知道如何写这听起来很粗鲁,但我使用的是 Java 和 StringWriter,而不是 C# 和 StreamWriter。它们有什么关系?
      猜你喜欢
      • 1970-01-01
      • 2013-02-08
      • 2010-12-15
      • 2011-01-02
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      相关资源
      最近更新 更多