java 读utf-8 xml_使用Java和UTF-8编码生成有效的XML

我正在使用JAXP来生成和解析从数据库加载一些字段的XML文档。

序列化XML的代码:

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

Document doc = builder.newDocument();

Element root = doc.createElement("test");

root.setAttribute("version", text);

doc.appendChild(root);

DOMSource domSource = new DOMSource(doc);

TransformerFactory tFactory = TransformerFactory.newInstance();

FileWriter out = new FileWriter("test.xml");

Transformer transformer = tFactory.newTransformer();

transformer.setOutputProperty(OutputKeys.INDENT, "yes");

transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

transformer.transform(domSource, new StreamResult(out));

解析XML的代码:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

factory.setNamespaceAware(true);

DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.parse("test.xml");

而且我遇到以下异常:

[Fatal Error] test.xml:1:4: Invalid byte 1 of 1-byte UTF-8 sequence.

Exception in thread "main" org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence.

at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)

at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)

at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)

at com.test.Test.xml(Test.java:27)

at com.test.Test.main(Test.java:55)

字符串文本包括u-umlaut和o-umlaut(字符代码0xFC和0xF6)。这些是导致错误的字符。当我逃避String自己使用& #xFC;和ö那么问题就消失了。当我写出XML时,其他实体会自动编码。

如何使我的输出正确写入/读取,而不是自己替换这些字符?

(我已经阅读了以下问题:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java的DOM API来创建XML文件,并使用Java的压缩流API将其压缩成字节流,并且可以指定XML文件编码UTF-8,最终将其发送给用户。以下是一个示例代码: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 创建XML文档 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument(); // 创建XML元素 Element root = doc.createElement("root"); doc.appendChild(root); Element child1 = doc.createElement("child1"); child1.setTextContent("This is child1"); root.appendChild(child1); Element child2 = doc.createElement("child2"); child2.setTextContent("This is child2"); root.appendChild(child2); // 将XML文档转换成字节数组 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); ByteArrayOutputStream bos = new ByteArrayOutputStream(); transformer.transform(new DOMSource(doc), new StreamResult(new OutputStreamWriter(bos, "UTF-8"))); byte[] xmlBytes = bos.toByteArray(); // 压缩XML字节数组 ByteArrayOutputStream compressedBos = new ByteArrayOutputStream(); ZipOutputStream zos = new ZipOutputStream(compressedBos); zos.putNextEntry(new ZipEntry("file.xml")); zos.write(xmlBytes); zos.closeEntry(); zos.close(); byte[] compressedBytes = compressedBos.toByteArray(); // 设置响应头信息 response.setContentType("application/zip"); response.setHeader("Content-Disposition", "attachment;filename=myfile.zip"); // 将压缩后的字节数组写入响应输出流 OutputStream out = response.getOutputStream(); out.write(compressedBytes); out.flush(); out.close(); } ``` 在上面的代码,我们首先使用DOM API创建了一个XML文档。然后,我们将XML文档转换成字节数组,并使用ZipOutputStream将其压缩成字节数组。在转换XML文档时,我们指定了编码UTF-8。最后,我们设置响应头信息,指定要下载的文件名和类型为application/zip,并将压缩后的字节数组写入响应输出流,完成文件的发送。 需要注意的是,以上代码创建的XML文件比较简单,如果需要创建更复杂的XML文件,可以使用Java的DOM API或者其他XML API来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值