Обнаружен недопустимый символ ''

Я получаю следующее исключение при разборе XML.

Fatal error at line -1  Invalid character '&#x0' encountered. No stack trace

У меня есть Xml-данные в строковом формате, и я анализирую их с помощью DOM parser. Я анализирую данные, которые являются ответом Java-сервера на клиент Blackberry. Я также попытался проанализировать с помощью Sax parser, но проблема не решена. Пожалуйста помочь.

6 ответов


У вас есть нулевой символ в вашем символьном потоке, т. е. char (0), который недопустим в XML-документе. Если этого нет в исходной строке, то это, скорее всего, проблема декодирования символов.


Я нашел решение,

Я просто обрезал его с отделкой() и у меня это отлично получалось.


ваш код в настоящее время называет getBytes() использование кодировки платформы по умолчанию-это очень редко хорошая идея. Узнайте, что такое кодировка данных на самом деле, и используйте это. (Скорее всего, это UTF-8.)

если Blackberry включает DocumentBuilder.parse(InputSource), Это было бы предпочтительней:

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
StringReader reader = new StringReader(xmlData);
try {
    Document doc = docBuilder.parse(xml); 
    doc.getDocumentElement().normalize();
} finally {
    reader.close();
}

если это не сработает, у очень внимательно посмотрите на свою строку, например, так:

for (int i=0; i < xmlData.length(); i++) {
    // Use whatever logging you have on the Blackberry
    System.out.println((int) xmlData.charAt(i));
}

возможно, что проблема заключается в чтении ответа от сервер-если Вы читаете его плохо, у вас могут быть нули Unicode (\u0000) в вашей строке, которые могут не отображаться явно в выходных данных журнала/отладки, но вызовут ошибку, которую вы показали.

EDIT: я только что видел, что вы получаете данные base64 в первую очередь - так зачем преобразовывать его в строку, а затем обратно в байты? Просто декодируйте base64 в массив байтов, а затем используйте его в качестве основы вашего ByteArrayInputStream. Тогда вам никогда не придется иметь дело с кодировкой текста в первую очередь.


пахнет, как будто вы пытаетесь разобрать пустую строку как XML. Вы проверили, что клиент получил хороший ответ?


какую кодировку вы используете? Может быть, используется Unicode и BOM отправляется в начале?


InputStream xml = new ByteArrayInputStream(xmlData.getBytes());
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(xml);
doc.getDocumentElement().normalize();
xml.close();

выше код я использую для парсинга.