Java читает странный символ в начале файла, который не существует - PullRequest
4 голосов
/ 06 февраля 2012

У меня есть простой XML-файл на моем жестком диске.Когда я открываю его с помощью блокнота ++, вот что я вижу:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<content>
... more stuff here ...
</content>

Но когда я читаю его, используя FileInputStream, я получаю:

?<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<content>...

Я использую JAXB для анализаXML, и он выдает исключение «содержание не разрешено в прологе» из-за этого «?»знак.

Что это за лишнее "?"знак?почему он там и как от него избавиться?

Ответы [ 6 ]

7 голосов
/ 06 февраля 2012

Этот дополнительный символ представляет собой метку порядка байтов , специальный код символа Unicode, который позволяет анализатору XML знать, каков порядок байтов (с прямым или прямым порядком байтов) байтов в файле.

Обычно ваш анализатор XML должен понимать это.(Если это не так, я бы посчитал это ошибкой в ​​синтаксическом анализаторе XML).

В качестве обходного пути убедитесь, что программа, создающая этот XML, исключает спецификацию.

2 голосов
/ 06 февраля 2012

Проверьте кодировку файла, я видел подобное, открывая файл в большинстве редакторов, и он выглядел нормально, оказалось, что он был закодирован с помощью UTF-8 без спецификации (или с, я не могу отменить макушка моей головы). Блокнот ++ должен быть в порядке, чтобы переключаться между ними.

1 голос
/ 06 февраля 2012

Вы можете использовать Блокнот ++, чтобы увидеть все символы из меню View > Show Symbols > Show All Characters. Это покажет вам дополнительные байты, присутствующие в начале. Существует вероятность того, что это метка порядка байтов. Если дополнительные байты действительно являются метками порядка байтов, такой подход не поможет. В этом случае вам нужно будет загрузить шестнадцатеричный редактор или, если у вас установлен Cygwin, выполните действия, описанные в последнем абзаце этого ответа. Как только вы увидите файл в виде шестнадцатеричных кодов, найдите первые два символа. У них есть один из кодов, упомянутых в http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

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

В меню выберите Encoding > Encoding in UTF-8 without BOM и сохраните файл.

(В Linux можно использовать инструменты командной строки для проверки того, что происходит в начале. Например, xxd -g1 filename | head или od -t cx1 filename | head.)

0 голосов
/ 08 апреля 2013

Рядом с FileInputStream у меня работал и ByteArrayInputStream:

JAXB.unmarshal(new ByteArrayInputStream(string.getBytes("UTF-8")), Delivery.class);

=> Больше не будет неустранимой ошибки.

0 голосов
/ 06 февраля 2012

это не проблема jaxb, проблема заключается в том, как вы используете для чтения XML ... попробуйте использовать inputsream

...
Unmarshaller u = jaxbContext.createUnmarshaller();
XmlDataObject xmlDataObject = (XmlDataObject) u.unmarshal(new FileInputStream("foo.xml"));
...
0 голосов
/ 06 февраля 2012

Возможно, у вас новая строка. Удалить это.

Выберите View > Show Symbol > Show All Characters в Notepad ++, чтобы увидеть, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...