"Содержимое не допускается в прологе" при разборе совершенно допустимого XML на GAE
Я бил головой об эту абсолютно бесящую ошибку в течение последних 48 часов, поэтому я думал, что наконец-то брошу полотенце и попробую спросить здесь, прежде чем выбросить свой ноутбук в окно.
Я пытаюсь проанализировать ответ XML из вызова, который я сделал AWS SimpleDB. Ответ возвращается на провод просто отлично; например, это может выглядеть так:
<?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
<ListDomainsResult>
<DomainName>Audio</DomainName>
<DomainName>Course</DomainName>
<DomainName>DocumentContents</DomainName>
<DomainName>LectureSet</DomainName>
<DomainName>MetaData</DomainName>
<DomainName>Professors</DomainName>
<DomainName>Tag</DomainName>
</ListDomainsResult>
<ResponseMetadata>
<RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId>
<BoxUsage>0.0000071759</BoxUsage>
</ResponseMetadata>
</ListDomainsResponse>
Я передаю в этом XML парсер с
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
и звонок eventReader.nextEvent();
куча время, чтобы получить данные, которые я хочу.
вот странная часть - он отлично работает внутри локального сервера. Приходит ответ, я его разбираю, все довольны. Проблема в том, что когда я развертываю код в Google App Engine, исходящий запрос все еще работает, и ответ XML кажется мне на 100% идентичным и правильным, но ответ не удается разобрать со следующим исключением:
com.amazonaws.http.HttpClient handleResponse: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.): <?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"><ListDomainsResult><DomainName>Audio</DomainName><DomainName>Course</DomainName><DomainName>DocumentContents</DomainName><DomainName>LectureSet</DomainName><DomainName>MetaData</DomainName><DomainName>Professors</DomainName><DomainName>Tag</DomainName></ListDomainsResult><ResponseMetadata><RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId><BoxUsage>0.0000071759</BoxUsage></ResponseMetadata></ListDomainsResponse>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source)
at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source)
at com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:153)
... (rest of lines omitted)
Я дважды, трижды, четыре раза проверил этот XML для "невидимых символов" или не в кодировке utf8 символов и т. д. Я посмотрел на него байт за байтом в массиве для меток порядка байтов или что-то в этом роде. Ничего; он проходит все проверочные тесты, которые я мог бы бросить на него. Еще более странно, это происходит, если я использую парсер на основе саксонского языка, но только на GAE, он всегда отлично работает в моей локальной среде.
это делает его очень трудно отслеживать код для проблем, когда я могу запустить отладчик только в среде, которая работает отлично (я не нашел хороший способ удаленная отладка на GAE). Тем не менее, используя примитивные средства, которые у меня есть, я пробовал миллион подходов, включая:
- XML с прологом и без него
- С новыми строками и без них
- С атрибутом "encoding=" в прологе и без него
- оба стиля новой строки
- С и без информации о фрагментации, присутствующей в потоке HTTP
и я пробовал большинство из них в нескольких комбинаций, где это имело смысл, они будут взаимодействовать-ничего! Я на грани безумия. Кто-нибудь видел такую проблему, прежде чем это может, надеюсь, пролить свет на нее?
спасибо!
12 ответов:
кодировка в вашем XML и XSD (или DTD) различны.
Заголовок XML-файла:<?xml version='1.0' encoding='utf-8'?>
Заголовок файла XSD:<?xml version='1.0' encoding='utf-16'?>
другой возможный сценарий, который вызывает это, когда что-либо приходит перед объявлением типа документа XML. то есть у вас может быть что-то вроде этого в буфере:
helloworld<?xml version="1.0" encoding="utf-8"?>
или даже пробел или специальный символ.
есть некоторые специальные символы, называемые маркерами порядком байтов, которые могут быть в буфере. До передав буфер парсеру, сделайте это...
String xml = "<?xml ..."; xml = xml.trim().replaceFirst("^([\W]+)<","<");
это сообщение об ошибке всегда вызвано недопустимым содержимым XML в начальном элементе. Например, очень маленькая точка "."в начале XML-элемента.
любые символы перед "
<?xml….
" приведет выше "орг.XML.саксофон.SAXParseException: содержание не допускается в прологе" сообщение об ошибке.точка "." перед
“<?xml….
чтобы исправить это, просто удалите все эти странные символы перед
“<?xml“
.Ref:http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/
я столкнулся с такой же проблемой. В моем случае XML-файлы были сгенерированы из программы c# и переданы в AS400 для дальнейшей обработки. После некоторого анализа выяснилось, что я использую кодировку UTF8 при создании XML-файлов, тогда как javac(в AS400) использует "UTF8 без спецификации". Итак, пришлось написать дополнительный код, похожий на упомянутый ниже:
//create encoding with no BOM Encoding outputEnc = new UTF8Encoding(false); //open file with encoding TextWriter file = new StreamWriter(filePath, false, outputEnc); file.Write(doc.InnerXml); file.Flush(); file.Close(); // save and close it
в моем xml-файле заголовок выглядел так:
<?xml version="1.0" encoding="utf-16"? />
в тестовом файле я читал байты файла и декодировал данные как UTF-8 (не понимая, что заголовок в этом файле был utf-16), чтобы создать строку.
byte[] data = Files.readAllBytes(Paths.get(path)); String dataString = new String(data, "UTF-8");
когда я пытался десериализовать эту строку в объект, я видел ту же ошибку:
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] Message: Content is not allowed in prolog.
когда я обновил вторую строку до
String dataString = new String(data, "UTF-16");
я смог десериализовать объект просто отлично. Так как Ромен имел отмечалось выше, кодировки должны совпадать.
я столкнулся с той же проблемой, которая называется "контент не разрешен в прологе" в моем xml-файле.
решение
изначально моя корневая папка была'#Filename'.
когда я удалил первый символ '#' ,ошибка прописи.
нет необходимости удалять #filename... Попробуйте вот так..
вместо передачи файла или объекта URL в метод unmarshaller используйте FileInputStream.
File myFile = new File("........"); Object obj = unmarshaller.unmarshal(new FileInputStream(myFile));
У меня был символ табуляции вместо пробелов. Замена вкладки "\t " исправила проблему.
вырезать и вставить весь документ в Редактор, как Notepad++ и отображать все символы.
ниже приведены причины выше " орг.XML.саксофон.SAXParseException: содержание не допускается в прологе" исключение.
- сначала проверьте путь к файлу схемы.xsd и файл.XML.
- кодировка в XML и XSD (или DTD) должна быть одинаковой.
Заголовок XML-файла:<?xml version='1.0' encoding='utf-8'?>
Заголовок файла XSD:<?xml version='1.0' encoding='utf-8'?>
- если что-то приходит перед объявлением типа XML-документа.я.е:
hello<?xml version='1.0' encoding='utf-16'?>
в духе "просто удалите все эти странные символы перед
BufferedReader test = new BufferedReader(new InputStreamReader(fisTest)); test.mark(4); while (true) { int earlyChar = test.read(); System.out.println(earlyChar); if (earlyChar == 60) { test.reset(); break; } else { test.mark(4); } }
FWIW, байты, которые я видел (в десятичном формате): 239, 187, 191.