Как записать в файл XML, сохранив существующие пространства имен - PullRequest
0 голосов
/ 12 июня 2019

Когда я анализирую XML-файл, существующие пространства имен в нем удаляются при записи в новый XML-файл. Как мне записать в новый XML-файл, сохраняя существующие пространства имен из файла, который я анализирую?

Я попытался зарегистрировать пространства имен на основе ответа, приведенного в этом посте, но не вижу различий в моем конечном результате: Сохранение файлов XML с использованием ElementTree

from xml.etree import ElementTree as ET

ET.register_namespace('xsi', "http://www.w3.org/2001/XMLSchema-instance")
ET.register_namespace('xsd', "http://www.w3.org/2001/XMLSchema")

tree = ET.parse(file_path)

tree.write('./new.xml',
           xml_declaration = True,
           encoding = 'utf-8',
           method = 'xml')

Оригинальный XML:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <settingsList>
            <setting name="ConnectionProperties" serializeAs="Xml">
                <value>
                    <SftpConnectionProperties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                        <Name></Name>
                    </SftpConnectionProperties>
                </value>
            </setting>
            <setting name="WebUrl" serializeAs="String">
                <value>https://test.com</value>
            </setting>
        </settingsList>
    </userSettings>
</configuration>

XML после выполнения кода:

<?xml version='1.0' encoding='utf-8'?>
<configuration>
    <userSettings>
        <settingsList>
            <setting name="ConnectionProperties" serializeAs="Xml">
                <value>
                    <SftpConnectionProperties>
                        <Name />
                    </SftpConnectionProperties>
                </value>
            </setting>
            <setting name="WebUrl" serializeAs="String">
                <value>https://test.com</value>
            </setting>
        </settingsList>
    </userSettings>
</configuration>

Я бы хотел сохранить пространства имен из исходного XML-файла в новом XML-файле.

1 Ответ

0 голосов
/ 22 июня 2019

Нашел этот сайт, который содержал пример того, что мне нужно для получения желаемого результата: http://effbot.org/zone/element-namespaces.htm

def parse_xmlns(file):

    events = "start", "start-ns"

    root = None
    ns_map = []

    for event, elem in ET.iterparse(file, events):

        if event == "start-ns":
            ns_map.append(elem)

        elif event == "start":
            if root is None:
                root = elem
            for prefix, uri in ns_map:
                elem.set("xmlns:" + prefix, uri)
            ns_map = []

    return ET.ElementTree(root)

tree = parse_xmlns(config_path)

tree.write('./new.xml',
           xml_declaration = True,
           encoding = 'utf-8',
           method = 'xml')
...