Как добавить данные в существующий XML-файл с помощью Python

Мне нужно добавить новую строку, например ./dir/pqr, в разделы <filename к следующему существующему XML-файлу. «URL» — это ссылка

<dbchangelog
    xmlns = "http://url/xml/ns/dbchangelog"
    xmlns:xsi = "http://url/2001/XMLSchema-instance"
    xsi:schemaLocation = "http://url/xml/ns/dbchangelog http://url/xml/ns/dbchangelog-4.1.xsd">
    <changeSet author = "name" id = "v3.0.0">
        <tagDatabase tag = "release/v3.0.0" />
    </changeSet>
    <dependencyManagement>
        <dependencies>
            <path>
                <filename>./dir/commons</filename>
            </path>
            <path>
                <filename>./dir/abc</filename>
            </path>
            <path>
                <filename>./dir/xyz</filename>
            </path>
        </dependencies>
    </dependencyManagement>
</dbchangelog>

Попробовал следующий фрагмент кода, он печатает добавленное значение, но фактически не добавляет его в файл.

import xml.etree.ElementTree as ET 
tree = ET.parse('pqr.xml')
root = tree.getroot() 
b = ET.SubElement(root, 'filename')
b.text = './dml/release/v3.0.0/abc_changelog.xml' 
print ET.tostring(root) 

Отвечает ли это на ваш вопрос? python elementtree xml добавление

Sebastian_Ulrich 19.02.2024 10:46

Нет, это не так. вероятно, потому, что структура xml другая. Я нашел несколько ответов, но ни один из них не подходит для указанного XML-файла.

Shivani 19.02.2024 12:23

Пожалуйста, поделитесь действительным примером XML.

Hermann12 19.02.2024 12:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
104
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не хватает закрытия " в следующей строке:

xsi:schemaLocation="http://url/xml/ns/dblogs >

При добавлении этого ваш код работает для меня со следующим выводом:

b'<ns0:dblogs xmlns:ns0 = "http://url/xml/ns/dblogs" xmlns:ns1 = "http://url/2001/XMLSchema-instance" ns1:schemaLocation = "http://url/xml/ns/dblogs">\n\n <ns0:changeSet author = "user_id" id = "v3.0.0">\n\n <ns0:tagDatabase tag = "release/v3.0.0" />\n\n </ns0:changeSet>\n\n <ns0:include file = "./file_one.xml" />\n\n <ns0:include file = "./file_two.xml" />\n\n<include>./dml/release/v3.0.0/abc_changelog.xml</include></ns0:dblogs

обратите внимание, что в вашем коде тег добавляется как:

<include>./dml/release/v3.0.0/abc_changelog.xml</include>

Чтобы он выглядел так же, как и другие, вам также необходимо включить пространство имен (Создание спецификаций пространства имен с помощью ElementTree в Python ) и аргумент файла ( Как добавить атрибуты к SubElement в ElementTree (Python) )

Вы потеряли объявление пространства имен.

Hermann12 19.02.2024 15:40
Ответ принят как подходящий

Вам необходимо зарегистрировать пространство имен и вставить атрибут вместо текста:

import xml.etree.ElementTree as ET

tree = ET.parse('pqr.xml')
root = tree.getroot()

# Register the Namespace
ns = {'': 'http://url/xml/ns/dblogs', 'xsi': 'http://url/2001/XMLSchema-instance', 'pro': 'http://url/xml/ns/dblogs/ns/pro'}
for key, value in ns.items():
    ET.register_namespace(key, value)

# Set attribute value instead of text
b = ET.SubElement(root, 'include')
b.attrib['file'] = './dml/release/v3.0.0/abc_changelog.xml'

ET.indent(root, space='  ')
ET.dump(root)

# Write the result to a new file:
tree = ET.ElementTree(root)
ET.indent(tree, space='  ')
tree.write("out_new.xml", xml_declaration=True, encoding='UTF-8')

Выход:

<dblogs xmlns = "http://url/xml/ns/dblogs" xmlns:xsi = "http://url/2001/XMLSchema-instance" xsi:schemaLocation = "http://url/xml/ns/dblogs">
  <changeSet author = "user_id" id = "v3.0.0">
    <tagDatabase tag = "release/v3.0.0" />
  </changeSet>
  <include file = "./file_one.xml" />
  <include file = "./file_two.xml" />
  <include file = "./dml/release/v3.0.0/abc_changelog.xml" />
</dblogs>

Но когда я открываю pqr.xml, я не вижу добавленной новой строки, хотя она отображается в выходных данных.

Shivani 19.02.2024 14:42

Как прочитать значение xmlns при анализе файла xml? Результат должен быть url/xml/ns/dblogs

Shivani 27.02.2024 14:24

Другие вопросы по теме