Синтаксический анализ XML с помощью SAX | как обрабатывать специальные символы? - PullRequest
3 голосов
/ 18 марта 2010

У нас есть приложение JAVA, которое извлекает данные из SAP, анализирует их и отображает пользователям. Данные извлекаются с использованием разъема JCO.

Недавно нам было брошено исключение:

org.xml.sax.SAXParseException: Character reference "&#00" is an invalid XML character.

Итак, мы планируем написать новый уровень косвенности, в котором ВСЕ специальные / недопустимые символы заменяются ДО анализа XML.

Мои вопросы здесь:

  1. Существует ли какая-либо существующая (с открытым исходным кодом) утилита, которая выполняет эту работу по замене недопустимых символов в XML?
  2. Или если бы мне пришлось написать такую ​​утилиту, как мне с ними обращаться?
  3. Почему выбрасывается указанное исключение?

Спасибо.

Ответы [ 4 ]

1 голос
/ 18 марта 2010

С моей точки зрения, источник (SAP) должен сделать замену. В противном случае то, что он передает в вашу программу, может выглядеть как XML, но это не так.

Хотя заменить '&' на '&' можно с помощью простого String.replaceAll (...) для строки from из вызова toXML (), другие символы сложнее заменить («<» и '>' для примера).

С уважением Гийом

1 голос
/ 18 марта 2010

Звучит как ошибка в их побеге. В зависимости от контекста вам лучше всего написать свою собственную версию их класса XMLWriter, которая использует настоящую библиотеку XML, а не пытаться писать свои собственные утилиты XML, как разработчики SAP.

В качестве альтернативы, глядя на код символа & # 00, вы можете обойтись без замены всех символов на пустую строку:

String goodXml = badXml.replaceAll("&#00;", "");
0 голосов
/ 10 ноября 2010

Вы можете кодировать / декодировать не-ASCII-символы в XML с помощью метода escape-XML класса StringEscapeUtils Apache Commons Lang. См:

http://commons.apache.org/lang/api-2.4/index.html

Чтобы прочитать о том, как работают ссылки на символы XML, поищите «ссылки на цифровые символы» в википедии.

0 голосов
/ 18 марта 2010

У меня была связанная, но противоположная проблема , где я пытался вставить символ 1 в вывод преобразования XSLT. Я рассмотрел постобработку для замены маркера на ноль, но вместо этого решил использовать xsl: param.

Если бы я был в вашей ситуации, я бы либо придумал кодировку на заказ, заменив символы, которые недопустимы в XML, и обработав их как особые случаи при разборе, либо, если возможно, заменил бы их пробелами.

У меня нет опыта работы с JCO, поэтому я не могу посоветовать, как и где я могу заменить недопустимые символы.

...