Python: обновить XML-файл с помощью ElementTree, максимально сохранив макет

У меня есть документ, использующий пространство имен XML, для которого я хочу увеличить /group/house/dogs на единицу: ( файл называется houses.xml)

<?xml version="1.0"?>
<group xmlns="http://dogs.house.local">
    <house>
            <id>2821</id>
            <dogs>2</dogs>
    </house>
</group>

Мой текущий результат с использованием приведенного ниже кода: (созданный файл называется houses2.xml)

<ns0:group xmlns:ns0="http://dogs.house.local">
    <ns0:house>
        <ns0:id>2821</ns0:id>
        <ns0:dogs>3</ns0:dogs>
    </ns0:house>
</ns0:group>

Я хотел бы исправить две вещи (если это возможно с помощью ElementTree. Если это не так, я был бы признателен за предложение относительно того, что я должен использовать вместо этого):

  1. Я хочу сохранить строка.
  2. Я не хочу добавлять префикс ко всем тегам, я хочу оставить все как есть.

В заключение, я не хочу возиться с документом

Мой текущий код (который работает, за исключением упомянутых выше недостатков), генерирующий вышеуказанный результат, следует ниже.

Я создал служебную функцию, которая загружает XML-файл с помощью ElementTree и возвращает elementTree и пространство имен (поскольку я не хочу жестко кодировать пространство имен и готов рискните):

def elementTreeRootAndNamespace(xml_file):
    from xml.etree import ElementTree
    import re
    element_tree = ElementTree.parse(xml_file)

    # Search for a namespace on the root tag
    namespace_search = re.search('^({\S+})', element_tree.getroot().tag)
    # Keep the namespace empty if none exists, if a namespace exists set
    # namespace to {namespacename}
    namespace = ''
    if namespace_search:
        namespace = namespace_search.group(1)

    return element_tree, namespace

Это мой код для обновления количества собак и сохранения его в новый файл houses2.xml:

elementTree, namespace = elementTreeRootAndNamespace('houses.xml')

# Insert the namespace before each tag when when finding current number of dogs,
# as ElementTree requires the namespace to be prefixed within {...} when a
# namespace is used in the document.
dogs = elementTree.find('{ns}house/{ns}dogs'.format(ns = namespace))

# Increase the number of dogs by one
dogs.text = str(int(dogs.text) + 1)

# Write the result to the new file houses2.xml.
elementTree.write('houses2.xml')
13
задан Deleted 7 March 2012 в 15:30
поделиться