使用 xml.etree.ElementTree 在 python 中解析 XML

Posted

技术标签:

【中文标题】使用 xml.etree.ElementTree 在 python 中解析 XML【英文标题】:parsing XML in python by using xml.etree.ElementTree 【发布时间】:2022-01-18 09:04:30 【问题描述】:

我使用 request 模块得到一个 XML 文件,然后我想使用 xml.etree.ElementTree 模块来获取元素的输出 核心-usg-01 但我已经很困惑怎么做,我卡住了。我尝试编写这个简单的代码来获取 sysname 元素,但我得到一个空输出。 Python代码:

import xml.etree.ElementTree as ET

tree = ET.parse('usg.xml')
root = tree.getroot()
print(root.findall('sysname'))

XML 文件:

<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
    <data>
        <system-state xmlns="urn:ietf:params:xml:ns:yang:ietf-system">
            <sysname xmlns="urn:huawei:params:xml:ns:yang:huawei-system">
                core-usg-01
            </sysname>
        </system-state>
    </data>
</rpc-reply>

【问题讨论】:

【参考方案1】:

试试下面的一种衬里

import xml.etree.ElementTree as ET


xml = '''<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
    <data>
        <system-state xmlns="urn:ietf:params:xml:ns:yang:ietf-system">
            <sysname xmlns="urn:huawei:params:xml:ns:yang:huawei-system">
                core-usg-01
            </sysname>
        </system-state>
    </data>
</rpc-reply>'''

root = ET.fromstring(xml)
print(root.find('.//urn:huawei:params:xml:ns:yang:huawei-systemsysname').text)

输出

core-usg-01

【讨论】:

【参考方案2】:

您需要在根目录上iter() 才能接触到孩子。

for child in root.iter():
   print (child.tag, child.attrib)

这将为您提供当前子标签及其属性。

urn:ietf:params:xml:ns:netconf:base:1.0rpc-reply 'message-id': '1'
urn:ietf:params:xml:ns:netconf:base:1.0data 
urn:ietf:params:xml:ns:yang:ietf-systemsystem-state 
urn:huawei:params:xml:ns:yang:huawei-systemsysname 

现在您需要使用以下代码循环到您想要的标签:

for child in root.findall('.//urn:ietf:params:xml:ns:yang:ietf-systemsystem-state'):
    temp = child.find('.//urn:huawei:params:xml:ns:yang:huawei-systemsysname')
    print(temp.text)

输出将如下所示:

core-usg-01

【讨论】:

以上是关于使用 xml.etree.ElementTree 在 python 中解析 XML的主要内容,如果未能解决你的问题,请参考以下文章

python解析xml文件之xml.etree.cElementTree和xml.etree.ElementTree区别

使用 xml.etree.ElementTree 获取子节点的所有实例

术业有专攻:xml.etree.ElementTree

如何使用 python xml.etree.ElementTree 解析 eBay API 响应?

python xml.etree.ElementTree 附加到子元素

[python 学习] 使用 xml.etree.ElementTree 模块处理 XML