【问题标题】:Get element value from xml file using Python使用 Python 从 xml 文件中获取元素值
【发布时间】:2019-10-30 09:38:26
【问题描述】:

我需要使用 Python 从 .xml 文件中提取/修改元素。为此,我正在使用 xml.etree.ElementTree 但我没有从我的代码中获得所需的输出。我需要从 .xml 文件中提取元素“地址”(在本例中为 10.25.0.0):

    <?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)。有人可以给我一个想法吗?

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    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"
    

    【讨论】:

    • 谢谢!如果我需要从“部署”中更改元素“名称”怎么办?正如您在代码中看到的,元素“名称”位于“部署”和“子网”下。当我申请“for DeploymentName in root.iter('{test.com/esc/esc}name'):”时,它显然改变了四个元素。
    • 好的。原来的问题已经回答了。非常感谢。我已经发布了新的,因为我仍然无法访问其他子元素,即使使用“查找”功能。
    【解决方案2】:

    我知道这可能不是您所期望的,但您可以随时尝试:

    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()
    

    【讨论】:

    • 这实际上是有用的纪尧姆。谢谢。如果我想修改“地址”中的值怎么办?我该怎么做?
    • 我已经编辑了我的答案,如果它符合您的需要,请告诉我
    • 感谢 Guillaume 的更新,但更改部分对我不起作用。它没有给出任何错误,但没有任何修改。
    • 我的错,我又更新了,现在应该可以正常工作了;)
    • 将 XML 文件视为纯文本文件是脆弱且容易出错的。 XML 是一种结构化格式,最好使用适当的 XML 工具(如 ElementTree)进行处理。
    猜你喜欢
    • 1970-01-01
    • 2022-12-03
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多