Сохранять существующие пространства имен при перезаписывании XML-файла с помощью ElementTree и Python

У меня есть XML-файл в следующем формате

<?xml version="1.0" encoding="utf-8"?> <foo> <bar> <bat>1</bat> </bar> <a> <b xmlns="urn:schemas-microsoft-com:asm.v1"> <c>1</c> </b> </a> </foo> 

Я хочу изменить значение bat на «2» и изменить файл на это:

 <?xml version="1.0" encoding="utf-8"?> <foo> <bar> <bat>2</bat> </bar> <a> <b xmlns="urn:schemas-microsoft-com:asm.v1"> <c>1</c> </b> </a> </foo> 

Я открываю этот файл, делая это

 tree = ET.parse(filePath) root = tree.getroot() 

Затем я изменяю значение bat на «2» и сохраняю файл следующим образом:

 tree.write(filePath, "utf-8", True, None, "xml") 

Значение bat успешно изменяется на 2, но XML-файл теперь выглядит следующим образом.

 <?xml version="1.0" encoding="utf-8"?> <foo xmlns:ns0="urn:schemas-microsoft-com:asm.v1"> <bar> <bat>2</bat> </bar> <a> <ns0:b> <ns0:c>1</ns0:c> </ns0:b> </a> </foo> 

Чтобы исправить проблему с пространством имен с именем ns0, перед выполнением анализа документа выполните следующие действия:

 ET.register_namespace('', "urn:schemas-microsoft-com:asm.v1") 

Это избавляет от пространства имен ns0, но файл xml теперь выглядит следующим образом:

 <?xml version="1.0" encoding="utf-8"?> <foo xmlns="urn:schemas-microsoft-com:asm.v1"> <bar> <bat>2</bat> </bar> <a> <b> <c>1</c> </b> </a> </foo> 

Что мне делать, чтобы получить нужный мне результат?

Interesting Posts

Прочитайте аргументы носа в файле, особенно @attr

Примеры поиска строк в Python

unbound method с экземпляром, поскольку первый аргумент получил строку, но требует чего-то еще

Обслуживание Python (Flask) REST API через HTTP2

Как взять максимум 2 столбца в фрейме данных и сделать его еще одним столбцом?

Как отсортировать кадр данных pandas, используя значения из нескольких столбцов?

Понимание логики состояния

расширить Python namedtuple со многими @properties?

Как найти наиболее распространенный элемент в списке, и если есть связь, первая, кто является последней причиной?

Печать в той же строке, шаг за шагом

Почему один и тот же запрос SQLite в 30 раз медленнее при получении всего в два раза больше результатов?

Расчет СКИСа Вейбулла

Почему генераторы не могут мариноваться?

Проверить вложенные значения словаря?

Как динамически добавлять mixins в качестве базовых классов без ошибок MRO?

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