Как разобрать и написать XML с использованием ElementTree Python без перемещения пространств имен?

Наш проект выходит из XML вверх этой формы:

<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="7.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> <appSettings> <add key="foo" value="default"> ... </appSettings> </configuration> 

Затем он считывает / анализирует этот XML с помощью ElementTree, а затем для каждого параметра приложения, соответствующего определенному ключу («foo»), он записывает новое значение, которое он знает о том, что процесс восходящего потока не выполняется (в этом случае ключ «foo» должен иметь значение «бар»).

Процесс нисходящего потока, обрабатывающий отфильтрованный XML, является aaahhhh … хрупким . Он рассчитывает получить XML в точности в форме выше.

Если я разбираю этот XML без регистрации пространства имен, то ElementTree управляет моим деревом, как это на входе:

 <configuration xmlns:ns0="urn:schemas-microsoft-com:asm.v1"> <runtime> <ns0:assemblyBinding> <ns0:dependentAssembly> <ns0:assemblyIdentity culture="neutral" name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" /> <ns0:bindingRedirect newVersion="7.0.0.0" oldVersion="0.0.0.0-6.0.0.0" /> </ns0:dependentAssembly> </ns0:assemblyBinding> </runtime> <appSettings> <add key="foo" value="default"> ... </appSettings> </configuration> 

Процесс нисходящего процесса не может справиться с этим, потому что он недостаточно умен, чтобы понять, что семантически это одно и то же. Поэтому я решил зарегистрировать пространство имен, которое, как мне известно, будет поддерживать в качестве пространства имен по умолчанию, чтобы избежать появления префиксов повсюду, и теперь я получаю следующее:

 <configuration xmlns="urn:schemas-microsoft-com:asm.v1"> <runtime> <assemblyBinding> <dependentAssembly> <assemblyIdentity culture="neutral" name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" /> <bindingRedirect newVersion="7.0.0.0" oldVersion="0.0.0.0-6.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> <appSettings> <add key="foo" value="default"> ... </appSettings> </configuration> 

Я мало разбираюсь в XML, но это также говорит о нижестоящем компоненте, и мне кажется, что теперь это не означает, что теперь xmlns умолчанию применяется ко всем включенным элементам внутри <configuration> , тогда как до этого он применяется только к элемент <assemblyBinding> ?

В любом случае, используя ElementTree , для обработки этого пространства имен, чтобы я мог взять XML вверх, установить значение foo , а затем передать это в нисходящем потоке, не перемещая пространство имен вокруг, и оставить его точно так, как я его нашел?

  • Я мог бы использовать решение на основе lxml, которое, похоже, справляется с этим, однако lxml имеет зависимость от C, для которого ничтожный компонент действительно не нуждается в поддержке: предпочтительным является чистое решение Python.

  • Я мог бы прочитать документ как HTML, который будет игнорировать атрибут пространства имен, позвольте мне манипулировать значением, которое я хочу, а затем передать документ; однако мне еще предстоит найти парсер Python, который не заменяет все имена элементов, а мой нисходящий компонент требует, чтобы оболочка на всех именах элементов сохранялась.

  • Я мог бы прибегнуть к синтаксическому анализу строк и регулярным выражениям. Я бы предпочел написать собственный парсер.

Единственный совет, который я мог найти до сих пор об обработке пространства имен в ElementTree, говорит о том, что «зарегистрировать подход по умолчанию для пространства имен, чтобы избежать префиксов», который, как я полагал, был бы подходящим, но ElementTree затем настаивает на перемещении объявления xmlns до корневого узла при демпинге.

Я мог бы также умело набирать строку, которая сбрасывает дерево поэтапно и точно в правильном порядке, чтобы вернуть объявление xmlns на «правый узел», но это также поражает меня как довольно проклятую хрупкость.

Кто-нибудь сумел преодолеть такую ​​проблему?

Interesting Posts

NameError: глобальное имя 'numpy' не определено

Модуль Python, не определенный в модуле при использовании пользовательской функции загрузки

Каков самый простой способ достижения графика в реальном времени в pyqtgraph

Круговая зависимость в кадре данных панд

Возможно ли реализовать функцию «изменить пароль при следующем входе в систему» ​​в администраторе django?

Управление несколькими витыми клиентскими подключениями

Python: неразрешенная ошибка импорта для sqlite3 в PyDev в Eclipse

Ограничение максимальной вставки Mongodb в Python

В чем разница между scgi и wsgi?

Что делать с сообщением об ошибке «Слишком длинная строка ввода»?

Полезность def __init __ (self)?

Вставить в cassandra из python с помощью cql

Запустите фоновый процесс в Python и НЕ ждите

Исключение Python в потоке Thread-1 (скорее всего, возникает при отключении интерпретатора)?

Как подавить вывод консоли в Python?

Python - лучший язык программирования в мире.