我的代码使用LSSerializer类编写XML文件:
DOMImplementation impl = doc.getImplementation();
DOMImplementationLS implLS = (DOMImplementationLS) impl.getFeature("LS","3.0");
LSSerializer ser = implLS.createLSSerializer();
String str = ser.writeToString(doc);
System.out.println(str);
String file = racine+"/"+p.getNom()+".xml";
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
out.write(str);
out.close();
XML格式正确,但是当我解析它时,我收到错误。
解析代码:
File f = new File(racine+"/"+filename);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(f);
XPathFactory xpfactory = XPathFactory.newInstance();
XPath xp = xpfactory.newXPath();
String expression;
expression = "root/nom";
String nom = xp.evaluate(expression, doc);
错误:
[Fatal Error] Terray.xml:1:40: Content is not allowed in prolog.
9 août 2011 19:42:58 controller.MakaluController activatePatient
GRAVE: null
org.xml.sax.SAXParseException: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:249)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:208)
at model.MakaluModel.setPatientActif(MakaluModel.java:147)
at controller.MakaluController.activatePatient(MakaluController.java:59)
at view.ListePatientsPanel.jButtonOKActionPerformed(ListePatientsPanel.java:92)
...
现在,通过一些研究,I found这个错误在XML的最开头就是一个“隐藏”的字符。
事实上,我可以通过手动创建XML文件来修复错误。
但XML编写中的错误在哪里? (当我尝试打印字符串时,之前没有空格
我运行了一段时间的UTF-16编码解决方案,但它不是很稳定。 所以我找到了一个新的解决方案:更改XML文档的序列化程序,以便XML头和文件编码之间的编码一致。 :
DOMSource domSource = new DOMSource(doc);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
String file = racine+"/"+p.getNom()+".xml";
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT,"yes");
transformer.transform(domSource, new StreamResult(out));
答案 0 :(得分:4)
但XML写作中的错误在哪里?
看起来错误不是在写作而是解析。正如您已经发现文件开头有一个空白字符,这会导致stach跟踪中的解析调用出错:
Document doc = builder.parse(f);
打印时看不到空格的原因可能只是您正在使用的编码。尝试更改此行:
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
使用'UTF-16'或'US-ASCII'
答案 1 :(得分:4)
我认为它可能与BOM(字节顺序标记)相关联。见Wikipedia
您可以通过示例使用Notepad ++进行验证:打开文件并选中“编码”菜单,查看您是否处于“无BOM的UTF8”或“带BOM的UTF8”。
答案 2 :(得分:1)
使用UTF-16是可行的方法,
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(fileName),"UTF-16");
这可以读取没有问题的文件
答案 3 :(得分:0)
试试这段代码:
InputStream is = new FileInputStream(file);
Document doc = builder.parse(is , "UTF-8");