Получить значение элемента из XML-файла, используя Python - PullRequest
0 голосов
/ 30 октября 2019

Мне нужно извлечь / изменить элемент из XML-файла, используя Python. Для этого я использую xml.etree.ElementTree, но не могу получить желаемый результат из своего кода. Мне нужно извлечь элемент "адрес" (в данном случае 10.25.0.0) из XML-файла:

    <?xml version="1.0" encoding="utf-8"?>
<esc
    xmlns="http://www.test.com/esc/esc">
    <tenants>
        <tenant>
            <name>esc</name>
            <deployments>
                <deployment>
                    <name>xyz1000_Test_v1</name>
                    <networks>
                        <network>
                            <name>tenant_1</name>
                            <admin_state>true</admin_state>
                            <subnet>
                                <name>tenant_1_sub</name>
                                <ipversion>ipv4</ipversion>
                                **<address>10.25.0.0</address>**
                            </subnet>
                        </network>
                        <network> .....

Я использую следующий код:

import xml.etree.ElementTree as ET
tree = ET.parse('csr1kv_file.xml')
root = tree.getroot()
ET.register_namespace("","http://www.test.com/esc/esc")

for subnet in root.iter('address'):
    print (subnet)

Из кода я не получаю ошибок и никаких значений (10.25.0.0 по желанию). Может кто-нибудь, пожалуйста, дайте мне идею?

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

register_namespace() не действует, когда вы выполняете итерацию или выполняете поиск в документе XML. Эта функция применяется только при сериализации (записи в файл).

Просто измените

for subnet in root.iter('address'):

на

for subnet in root.iter('{http://www.test.com/esc/esc}address'):

Вывод:

<Element '{http://www.test.com/esc/esc}address' at 0x030F3CF0>
(and possibly more address elements)

Чтобы получить значение элемента на выходе, используйте print(subnet.text).

Чтобы установить новое значение элемента, присвойте subnet.text:

subnet.text = "whatever"
0 голосов
/ 30 октября 2019

Я знаю, что это, вероятно, не то, что вы ожидаете, но вы всегда можете попробовать это следующим образом:

with open('csr1kv_file.xml') as f:
     address = str(f.read()).split("<address>")[1].split("</address>")[0]

Редактировать: я отвечаю здесь, раздел комментариев является болью иметь дело с

Если вы хотите изменить значение <адрес> на что-то другое, вы можете попробовать:

    with open('csr1kv_file.xml') as f:
        address = str(f.read()).split("<address>")[1].split("</address>")[0]
        f_update = str(f.read()).replace("<address>" + str(address) + "</address>", "<address> whatever_address_you_want </address>")

    with open('csr1kv_file.xml', 'w') as f2:
        f2.write(f_update)

Изменить номер 2: Это работаетправильно на моей машине с примерами данных, которые вы предоставляете:

with open('csr1kv_file.xml') as f:
    full = f.read()
    address = str(full).split("<address>")[1].split("</address>")[0]    

f.close()

f_update = str(full).replace("<address>" + str(address) + "</address>","<address>whatever_ip</address>")

with open('csr1kv_file.xml', 'w') as f2:
    f2.write(f_update)

f2.close()
...