Мне нужно добавить новую строку, например ./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)
Нет, это не так. вероятно, потому, что структура xml другая. Я нашел несколько ответов, но ни один из них не подходит для указанного XML-файла.
Пожалуйста, поделитесь действительным примером XML.






Вам не хватает закрытия " в следующей строке:
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) )
Вы потеряли объявление пространства имен.
Вам необходимо зарегистрировать пространство имен и вставить атрибут вместо текста:
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, я не вижу добавленной новой строки, хотя она отображается в выходных данных.
Как прочитать значение xmlns при анализе файла xml? Результат должен быть url/xml/ns/dblogs
Отвечает ли это на ваш вопрос? python elementtree xml добавление