Обнаружен недопустимый символ ''
Я получаю следующее исключение при разборе XML.
Fatal error at line -1 Invalid character '�' 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();
выше код я использую для парсинга.