Экспат синтаксического анализа XML в данных обработки Python
-
16-09-2019 - |
Вопрос
Я пытаюсь проанализировать файл XML с помощью Python Expat.У меня есть следующая строка в моем XML-файле:
<Action><fail/></Action>
expat идентифицирует начальный и конечный теги, но преобразует & lt;для символа «меньше» и того же для символа «больше» и, таким образом, анализирует его следующим образом:
исход:
START 'Action'
DATA '<'
DATA 'fail/'
DATA '>'
END 'Action'
вместо желаемого:
START 'Action'
DATA '<fail/>'
END 'Action'
Я хотел бы добиться желаемого результата, как мне не допустить, чтобы экспат напортачил?
Решение
эмигрант не портит, <
это просто XML-кодировка символа <
.Совсем наоборот, если бы экспат возвращал буквальное значение <
, это будет ошибкой по отношению к спецификации XML.При этом вы, конечно, можете вернуть экранированную версию, используя xml.sax.saxutils.escape
:
>>> from xml.sax.saxutils import escape
>>> escape("<fail/>")
'<fail/>'
Парсер expat также может сообщать все строковые данные в любых фрагментах, которые кажутся подходящими, поэтому вам придется объединить их самостоятельно.
Другие советы
Синтаксические анализаторы SAX и StAX могут разбивать строки любым удобным для них способом (хотя у StAX есть режим COALESCE, который заставляет его собирать фрагменты за вас).
Причина в том, что в некоторых случаях часто можно написать программное обеспечение, которое выполняет потоковую передачу и не заботится о накладных расходах на повторную сборку фрагментов строк.
Обычно я накапливаю текст в переменной и использую ее содержимое, когда вижу следующее событие StartElement или EndElement.В этот момент я также сбрасываю переменную накопленного текста в пустое значение.