Я бився головою проти цього абсолютно гнівного клопа протягом останніх 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
І я спробував більшість із них у кількох комбінаціях, де було сенс, що вони взаємодіють - нічого! Я на своєму кмітливості. Хтось бачив подібну проблему до цього, можемо сподіватися пролити трохи світла на це?
Дякую!