Исправить неверный XML с амперсандами в Python - PullRequest
5 голосов
/ 22 мая 2011

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

<IceCream>Ben&Jerry</IceCream>


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

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

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

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

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

1 Ответ

4 голосов
/ 22 мая 2011

Используйте привязки Python для tidylib :

>>> import tidylib
>>> print tidylib.tidy_document("<IceCream>Ben&Jerry</IceCream>", {"input_xml": True})[0]
<IceCream>Ben&amp;Jerry</IceCream>

В официальной документации приведен список параметров парсера .

...