Исправить недопустимый XML с амперсандами в Python

Я использую Python для управления XML-файлом, полученным из другой системы. Эта система создает недопустимый XML. В основном он не избегает некоторых символов & в XML.
Так, например, у меня есть несколько таких строк:

<IceCream>Ben&Jerry</IceCream>


Конечно, при синтаксическом анализе с помощью SAX или DOM возникает ошибка недопустимого токена.
В общем, это очень большой файл (2 МБ), довольно плоский и содержит много данных в CDATA.

Что я пробовал:

  1. Написание Regex для замены только без выхода & без повторного выхода & gt; и такие: & (?! \ w {2,4};) . Он исправил это, но он избежал амперсандов в CDATA, которые затем вызывали ошибки в целевой системе. Я не могу потом отменить экранирование всего, что находится в CDATA, потому что некоторые из них должны оставаться в экранировании.
  2. Использование Beautiful (Stone) Soup . Тоже не повезло. Вместо того, чтобы избежать свободных амперсандов, он создал объект (например, & Jerry; ). Не хорошо.

Следующим шагом будет написание моего собственного анализатора с использованием конечного автомата. Спаси меня от того, чтобы пойти по этой дороге.
Это несложная структура (очень плоская, глубиной не более 4 слоев), поэтому, возможно, регулярное выражение сможет улавливать области, которых нет в CDATA.

Большое спасибо.

5
задан yulkes 22 May 2011 в 15:03
поделиться