【问题标题】:Java XML parsing error : Content is not allowed in prologJava XML解析错误:prolog中不允许内容
【发布时间】:2011-10-23 11:01:12
【问题描述】:

我的代码用 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 文件来修复这个 bug。

但是 XML 写入的错误在哪里? (当我尝试打印字符串时,在 ths 之前没有空格

解决方案:更改序列化程序

我运行了一段时间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));

【问题讨论】:

标签: java xml parsing utf-8


【解决方案1】:

但是 XML 写入的错误在哪里?

看起来错误不在写作中,而是在解析中。正如您已经发现文件开头有一个空白字符,这会导致 stach 跟踪中的 parse 调用出错:

Document doc = builder.parse(f);

打印出来时看不到空格的原因可能只是您使用的编码。尝试更改此行:

OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");

使用“UTF-16”或“US-ASCII”

【讨论】:

  • 是的!解决方法:使用 UTF-16 编码。奇怪。
【解决方案2】:

我认为它可能与 BOM(字节顺序标记)有关。见Wikipedia

您可以通过示例使用 Notepad++ 进行验证:打开文件并检查“编码”菜单,看看您是在“UTF8 without BOM”还是“UTF8 with BOM”中。

【讨论】:

  • 要确认这一点,请使用十六进制编辑器查看输入。不久前我遇到了同样的问题,并通过在将数据提供给验证解析器之前先消耗 BOM 字节来解决它。
  • 要检查的字节是:0xEF,0xBB,0xBF
  • 啊,神秘:使用“UTF-8”选项,我得到一个 AINSI 文件;并使用“UTF-16”选项,我得到一个 UTF16 编码文件!
【解决方案3】:

使用 UTF-16 是要走的路,

 OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(fileName),"UTF-16");

这可以毫无问题地读取文件

【讨论】:

    【解决方案4】:

    试试这个代码:

    InputStream is = new FileInputStream(file);
    Document doc = builder.parse(is , "UTF-8");
    

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 2016-11-28
      • 1970-01-01
      • 2011-02-05
      • 2011-06-19
      • 2015-12-15
      • 2019-04-23
      • 2023-04-06
      • 2019-03-09
      相关资源
      最近更新 更多