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

Мне нужно извлечь / изменить дочерний элемент из XML-файла, используя Python. Для этого я использую xml.etree.ElementTree, но не могу получить желаемый результат из своего кода. Мне нужно извлечь элемент "name" в разделе "deploy" (в данном случае xyz1000_Test_v1) из файла .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 DeploymentName in root.iter('{http://www.test.com/esc/esc}name'):
    print(DeploymentName.text)
    name.text="New deplaoyment name"

Однако из кода я получаю значение элемента в разделах «развертывание», «сеть» и «подсеть». Как я могу получить доступ к определенному элементу? Заранее спасибо.

Обновление:

Пытаясь вывести "имя" из элемента "сеть", у меня есть этот код. К сожалению, это не дает мне ожидаемого ответа:

for network in root.findall('{http://www.test.com/esc/esc}network'):
    name = network.find('name').text
    print(name)

1 Ответ

0 голосов
/ 06 ноября 2019

Все элементы в документе привязаны к одному и тому же пространству имен, и элемент network не является непосредственным дочерним элементом корня.

При findall() используйте это:

for network in root.findall('.//{http://www.test.com/esc/esc}network'):
    name = network.find('{http://www.test.com/esc/esc}name')

Или используйте iter():

for network in root.iter('{http://www.test.com/esc/esc}network'):
    name = network.find('{http://www.test.com/esc/esc}name')
    if name is not None:  # Avoid "'NoneType' object has no attribute 'text'"
        name.text= 'new name'
...