Ошибка синтаксического анализа Java XML: содержимое не разрешено в прологе - PullRequest
1 голос
/ 09 августа 2011

Мой код записывает XML-файл с классом LSSerializer:

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)
...

Теперь, проведя некоторые исследования, Я обнаружил , что эта ошибка является верной для "скрытого" символа в самом начале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));

Ответы [ 4 ]

4 голосов
/ 09 августа 2011

Я думаю, что это, вероятно, связано с BOM (Byte Order Mark). См. Википедия

Вы можете проверить с помощью Notepad ++, например: Откройте свой файл и проверьте меню «Кодировка», чтобы увидеть, находитесь ли вы в «UTF8 без BOM» или «UTF8 с BOM».

4 голосов
/ 09 августа 2011

Но где ошибка в записи XML?

Похоже, ошибка не в записи, а в разборе.Как вы уже обнаружили, в начале файла есть пустой символ, который вызывает ошибку в вызове разбора в вашей трассировке:

Document doc = builder.parse(f);

Причина, по которой вы не видите пробел при печатиэто может быть просто кодировка, которую вы используете.Попробуйте изменить эту строку:

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

, чтобы использовать 'UTF-16' или 'US-ASCII'

1 голос
/ 09 июля 2014

Использование UTF-16 - путь,

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

Это может прочитать файл без проблем

0 голосов
/ 21 июня 2016

Попробуйте этот код:

InputStream is = new FileInputStream(file);
Document doc = builder.parse(is , "UTF-8");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...