Mantenha os namespaces existentes ao substituir o arquivo XML com ElementTree e Python
Eu tenho um arquivo XML no seguinte formato
<?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>
Quero alterar o valor de bat para '2' e alterar o arquivo para este:
<?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>
Eu abro este arquivo fazendo isso
tree = ET.parse(filePath)
root = tree.getroot()
Depois, altero o valor de bat para '2' e salve o arquivo assim:
tree.write(filePath, "utf-8", True, None, "xml")
O valor de bat muda com sucesso para 2, mas o arquivo XML agora se parece com isso.
<?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>
Para corrigir o problema de ter um espaço para nome chamado ns0, faça o seguinte antes de analisar o documento
ET.register_namespace('', "urn:schemas-microsoft-com:asm.v1")
Isso elimina o namespace ns0, mas o arquivo xml agora se parece com isso
<?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>
O que faço para obter a saída necessária?