Анализ XML-документа Java дает содержимое, не разрешенное в прологе. ошибка

Я пишу программу на Java, которая берет пользовательский файл XML и анализирует его. Я использую файл XML для хранения. Я получаю следующую ошибку в Eclipse.

[Fatal Error] :1:1: Content is not allowed in prolog.
org.xml.sax.SAXParseException: Content is not allowed in prolog.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:239)
    at     com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283  )
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:208)
    at me.ericso.psusoc.RequirementSatisfier.parseXML(RequirementSatisfier.java:61)
    at me.ericso.psusoc.RequirementSatisfier.getCourses(RequirementSatisfier.java:35)
    at     me.ericso.psusoc.programs.RequirementSatisfierProgram.main(RequirementSatisfierProgram.java:23  )

Включено начало файла XML:

<?xml version="1.0" ?>
<PSU>
     <Major id="IST">
        <name>Information Science and Technology</name>
        <degree>B.S.</degree>
        <option> Information Systems: Design and Development Option</option>
        <requirements>
            <firstlevel type="General_Education" credits="45">
                <component type="Writing_Speaking">GWS</component>
                <component type="Quantification">GQ</component>

Программа может читать файл XML, но когда я вызываю DocumentBuilder.parse(XMLFile) для получения проанализированного org.w3c.dom.Document, я получаю указанную выше ошибку.

Мне не кажется, что у меня есть недопустимое содержимое в прологе моего файла XML. Я не могу понять, что не так. Пожалуйста помоги. Спасибо.


person ericso    schedule 08.04.2010    source источник
comment
Я нашел свою ошибку. Я читал в папке, в которой был файл, а не в самом файле. По-видимому, если вы читаете папку как файл и вызываете для него File.exists(), он все равно вернет true. Глупый я... Спасибо за всю помощь.   -  person ericso    schedule 09.04.2010
comment
проверьте мой ответ по адресу stackoverflow.com/questions/3665554/ или просто перейдите по этой ссылке mark.koli.ch/2009/02/   -  person Starfish    schedule 11.08.2011
comment
не знаю, поможет ли это кому-нибудь, но я получил эту ошибку, пытаясь использовать flavorDimensions и помещая drawable-xhdpi в res в моих ароматах. Как только я изменил его на drawable.. все исправлено   -  person dangalg    schedule 13.02.2015


Ответы (8)


Пожалуйста, проверьте файл xml, есть ли в нем какой-либо ненужный символ, подобный этому. Если он существует, используйте следующий синтаксис, чтобы удалить его.

String XString = writer.toString();
XString = XString.replaceAll("[^\\x20-\\x7e]", "");
person Gopal    schedule 19.04.2012
comment
Я нашел эту действительно простую технику довольно полезной в качестве быстрого исправления. Однако, чтобы сохранить новые строки, вы можете предпочесть регулярное выражение replaceAll("[^\\x20-\\x7e\\x0A]", ""); - person Patrick; 12.01.2013
comment
Внимание: это удалит любые символы Unicode и в основном не то, что хотят люди. - person Michael; 29.11.2018

Думаю, это тоже решение этой проблемы.

Измените тип документа с 'Кодировать в UTF-8' на 'Кодировать в UTF-8 без спецификации'.

Я решил свою проблему, выполнив те же изменения.

person Java_Alert    schedule 01.11.2012

Убедитесь, что в начале XML-файла нет скрытых пробелов. Также, возможно, включите кодировку = "UTF-8" (или 16? Не знаю) в узле.

person Ben J    schedule 08.04.2010
comment
К сожалению, это, скорее всего, причина. - person Esko; 08.04.2010
comment
Проверил в BBEdit скрытые символы и добавил атрибут кодировки в XML-декларацию. Оба не исправили. - person ericso; 08.04.2010

Документ выглядит хорошо для меня, но я подозреваю, что он содержит невидимые символы. Откройте его в шестнадцатеричном редакторе, чтобы убедиться, что перед самой первой «‹» действительно ничего нет. Убедитесь, что пробелы в заголовке XML являются пробелами. Может быть, удалить пробел перед "?>". Проверьте, какие разрывы строк используются.

Убедитесь, что документ соответствует кодировке UTF-8. Некоторые редакторы Windows сохраняют документ как UTF-16 (т. е. каждый второй байт равен 0).

person Aaron Digulla    schedule 08.04.2010
comment
Я редактировал файл XML в текстовом редакторе Eclipse. У меня Mac, и я также использую BBEdit. Я проверю невидимые символы. - person ericso; 08.04.2010
comment
Я проверил наличие невидимых символов в BBEdit (Просмотр › Отображение текста › Показать невидимые) и не вижу невидимых символов в объявлении XML. Я также удалил пробел в конце объявления. Я добавил кодировку = UTF-8 и кодировку = UTF-16, и я все еще получаю сообщение об ошибке. - person ericso; 08.04.2010
comment
Какая кодировка файла? то есть не то, что вы думаете, а то, что говорит ваш редактор? - person Aaron Digulla; 08.04.2010
comment
Также убедитесь, что вы действительно просматриваете файл, который вызывает ошибку! - person Aaron Digulla; 08.04.2010
comment
Я проверил тип кодировки в BBEdit; это UTF-16. Я почти уверен, что смотрю на правильный файл. Ниже приведен мой код для чтения файла и его разбора: File f = new File(/Users/thechiman/Dropbox/introcs/PSU SOC Crawler/src/resources); //Проверяем, существует ли файл if(f.exists()) { System.out.println(файл существует); } else { System.out.println(файл не существует); } //Используем factory для получения нового DocumentBuilder DocumentBuilder db = dbf.newDocumentBuilder(); //Разбираем файл XML, получаем DOM-представление this.dom = db.parse(f); - person ericso; 08.04.2010
comment
Что ж, парсер ожидает кодировку UTF-8, а ваш файл — UTF-16. Это означает, что первый байт файла равен 0, и вы получаете ошибку. Сохраните файл в правильной кодировке (UTF-8), чтобы устранить проблему. - person Aaron Digulla; 08.04.2010
comment
Я сохранил файл как UTF-8 и UTF-8, без спецификации. Оба раза я получаю ту же ошибку. - person ericso; 08.04.2010
comment
В этом случае вы редактируете файл, отличный от того, который читает парсер. - person Aaron Digulla; 09.04.2010

Я предполагаю, что у вас есть правильная кодировка xml и соответствие со схемой.

Если вы все еще получаете эту ошибку, проверьте код, который распаковывает xml и тип ввода, которые вы использовали. Поскольку XML-документы объявляют свою собственную кодировку, предпочтительнее создавать объект StreamSource из InputStream, а не из Reader, чтобы XML-процессор мог правильно обрабатывать объявленную кодировку [Справочная книга: Java в двух словах]

Надеюсь это поможет!

person spark07    schedule 02.05.2012

Вы не указываете правильный адрес файла. Вам необходимо указать адрес, например C:/Users/xyz/Desktop/myfile.xml

person Amit Agarwal    schedule 11.11.2012
comment
ОП обнаружил это и указал на это в комментарии к вопросу. - person kolossus; 12.11.2012

Если вы можете управлять файлом xml, попробуйте добавить немного больше информации в начало файла:

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
person Drew Johnson    schedule 08.04.2010
comment
Я добавил как автономный = нет, так и автономный = да. Оба дают мне ту же ошибку. - person ericso; 08.04.2010
comment
хммм... Следующее, что я бы попробовал, это грубая сила - попробуйте получить фиктивный документ через анализатор, затем медленно добавляйте части исходного документа, пока не сможете определить проблему. Я уже был на этом пути :-) - person Drew Johnson; 08.04.2010

Проверьте наличие проблем с синтаксисом в файле XML. Я обнаружил эту ошибку при работе с xsl/xsp с помощью Cocoon, и я определяю переменную, используя несуществующий узел или что-то в этом роде. Проверьте весь XML.

person Alfabravo    schedule 08.04.2010
comment
Я получаю сообщение об ошибке, прежде чем смогу что-либо сделать с проанализированным документом. Когда я вызываю DocumentBuilder.parse(XMLFile), происходит сбой. Я пропустил файл XML через средство проверки XML (xmlvalidation.com), и все прошло нормально. - person ericso; 08.04.2010
comment
Доступен ли файл в указанном месте? Возможно, ваша программа не может получить доступ к содержимому файла, и синтаксический анализатор просто говорит, что то, что он нашел, не является допустимым xml... просто предположение. - person Alfabravo; 09.04.2010
comment
@Alfabravo немного другой вопрос, знаете ли вы, если я получу ошибку синтаксического анализа, как я могу поймать это исключение. Построитель документов в java не генерирует исключение, а печатает в потоке ошибок, так как я могу уведомить пользователя, если был предоставлен поврежденный файл? - person Space Rocker; 14.04.2013