Tôi đang sử dụng JAXP để tạo và phân tích cú pháp một tài liệu XML mà từ đó một số trường được tải từ cơ sở dữ liệu.Sản xuất XML hợp lệ với mã hóa Java và UTF-8
Mã để serialize 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));
Mã để phân tích cú pháp XML:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("test.xml");
Và tôi bắt gặp ngoại lệ sau đây:
[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)
Văn bản Chuỗi bao gồm u- umlaut và o-umlaut (mã ký tự 0xFC và 0xF6). Đây là những nhân vật gây ra lỗi. Khi tôi thoát khỏi chuỗi bản thân mình để sử dụng & #xFC; và & # xF6; thì vấn đề sẽ biến mất. Các thực thể khác được tự động mã hóa khi tôi viết ra XML.
Làm cách nào để đầu ra của tôi được viết/đọc đúng cách mà không tự thay thế các ký tự này?
(Tôi đã đọc các câu hỏi sau đây đã:
How to encode characters from Oracle to XML?
Repairing wrong encoding in XML files)
Đẹp và dễ dàng, tôi đã nghĩ đến việc thay đổi điều này nhưng đã loại bỏ ý tưởng vì tôi không thấy cách xác định mã hóa trong hàm tạo. Nó hoạt động tốt, cảm ơn. –
Tôi tự bắn mình vào chân với FileWriter một lần .... +1 –
Câu trả lời hay - Tôi sẽ luôn tìm kiếm Gotchas ẩn trong FileWriter từ bây giờ! –