Как мне обрабатывать пробелы с помощью дерева элементов Python?

Проблема:

Когда пробел незначителен, представление может быть очень важным.

Объяснение:

В XML Schema Part 2: Datatypes Second Edition ограничивающий аспект whiteSpace определен для типов, производных от string (http://www.w3.org/TR/xmlschema-2/#rf-whiteSpace). Если этот аспект whiteSpace имеет значение replace или collapse, значение может быть изменено во время нормализация.

В конце Раздел 4.3.6 есть примечание:

Обозначение #xA, используемое здесь (и в других местах в этой спецификации), представляет кодовую точку универсального набора символов (UCS) в шестнадцатеричной форме A (перевод строки), которая обозначается U+000A. Эту нотацию следует отличать от , которая является ссылкой символа XML на ту же кодовую точку UCS.

Пример:

Если тип данных для элемента elem имеет ограничение пробелы collapse, "<elem> text </elem>" должно стать "text" (начальные и конечные пробелы удалены), а "<elem>&#x20;text&#x20;</elem>" должно стать " text " (пробелы, закодированные ссылкой на символ, не удалены).

Вопросы:

Таким образом, либо синтаксический анализатор/построитель дерева обрабатывает эту нормализацию, либо это делается позже.

  • Informed parsing:
    • Where do I provide the parser or tree builder with the information on how to normalize some XML element?
    • Есть что-то вроде set_whitespace_normalization('./country/neighbor', 'collapse')?
    • Есть ли в синтаксическом анализаторе или построителе дерева такой хук, как normalize(content)?
  • Post processing
    • How do I access the original content of some element?
    • Есть ли elem.original_text, который может вернуть "&#x20;text&#x20;"?
    • Есть ли elem.unnormalized_text, который может вернуть "text"?

Я хотел бы использовать Python xml.etree.ElementTree, но я рассмотрю любую другую XML-библиотеку, которая выполняет эту работу.

Отказ от ответственности:

Конечно, объявлять пробелы незначимыми (заменять или сворачивать) — плохой стиль, а затем обманывать, используя ссылки на символы. В большинстве случаев для предотвращения этого следует изменить либо данные, либо схему, но иногда вам приходится работать с иностранными XML-схемами и иностранными XML-документами. И само существование примечания, процитированного выше, указывает на то, что XML-редакторы знали об этой дилемме и сознательно не предотвращали ее.


person Yurim    schedule 07.06.2013    source источник


Ответы (1)


Похоже, это известная ошибка в xml.etree.ElementTree: http://bugs.python.org/issue17582. Согласно этому отчету об ошибке, это правильно обрабатывается в lxml.etree: https://pypi.python.org/pypi/lxml/.

person Mark Pundurs    schedule 25.02.2014