有 Java 编程相关的问题?

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

Java、XML DocumentBuilder在解析时设置编码

我正在尝试将一个树(扩展JTree)保存为一个XML文档,该树的结构已经更改

我已经创建了一个新的文档对象,遍历了树以成功地检索内容(包括XML文档的原始编码),现在有了一个ByteArrayInputStream,它具有正确编码的树内容(XML文档)

问题是当我解析ByteArrayInputStream时,编码会自动更改为UTF-8(在XML文档中)

是否有办法防止这种情况,并使用ByteArrayInputStream中提供的正确编码

还值得补充的是,我已经使用了
transformer.setOutputProperty(OutputKeys.ENCODING, encoding)方法来检索正确的编码

任何帮助都将不胜感激


共 (4) 个答案

  1. # 1 楼答案

    // Read XML
    String xml = "xml"
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(new InputSource(new StringReader(xml)));
    
    // Append formatting
    OutputFormat format = new OutputFormat(document);
    
    if (document.getXmlEncoding() != null) {
      format.setEncoding(document.getXmlEncoding());
    }
    
    format.setLineWidth(100);
    format.setIndenting(true);
    format.setIndent(5);
    Writer out = new StringWriter();
    XMLSerializer serializer = new XMLSerializer(out, format);
    serializer.serialize(document);
    String result = out.toString();
    
  2. # 2 楼答案

    经过大量的尝试和错误,我解决了这个问题

    我在用

    OutputFormat format = new OutputFormat(document);
    

    但是改成了

    OutputFormat format = new OutputFormat(d, encoding, true);
    

    这就解决了我的问题

    encoding是我设置的
    true表示是否设置了缩进

    自我阅读注意事项——我几个小时前就看过javadoc了——如果我读得更仔细就好了

  3. # 3 楼答案

    以下是一个更新的答案,因为OutputFormat已被弃用:

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
    
    StringWriter writer = new StringWriter();
    transformer.transform(new DOMSource(document), new StreamResult(writer));
    String output = writer.getBuffer().toString().replaceAll("\n|\r", "");
    

    第二部分将以字符串形式返回XML文档

  4. # 4 楼答案

    这对我来说很有效,非常简单。无需转换器或输出格式化程序:

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputSource is = new InputSource(inputStream);
    is.setEncoding("ISO-8859-1"); // set your encoding here
    Document document = builder.parse(is);