Java,XML DocumentBuilder – 在解析时设置编码
我正在尝试保存一个树(扩展JTree
),它将XML
文档保存到DOM Object
并改变了它的结构。
我创建了一个新的文档对象,遍历了树以成功检索内容(包括XML
文档的原始编码),现在有一个ByteArrayInputStream
,它具有正确编码的树内容( XML
文档)。
问题是,当我解析ByteArrayInputStream
,编码会自动更改为UTF-8
(在XML
文档中)。
有没有办法防止这种情况并使用ByteArrayInputStream
提供的正确编码。
值得补充的是,我已经使用了
transformer.setOutputProperty(OutputKeys.ENCODING, encoding)
方法检索正确的编码。
任何帮助,将不胜感激。
// 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();
这是一个更新的答案,因为不推荐使用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 Document作为String返回
我解决了它,给出了很多试验和错误。
我在用
OutputFormat format = new OutputFormat(document);
但改成了
OutputFormat format = new OutputFormat(d, encoding, true);
这解决了我的问题。
encoding
就是我设定的
true
表示是否设置缩进。
注意自我阅读更仔细 – 我几小时前看过javadoc – 只要我仔细阅读。
这对我有用,而且非常简单。 无需变压器或输出格式器:
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);