【问题标题】:Find an attribute based on an elements name in XML on all levels在所有级别上根据 XML 中的元素名称查找属性
【发布时间】:2021-09-08 09:19:33
【问题描述】:

这是我要解析的 XML:

<State id="1">
    <Initialize>
        <ObjectId value="Obj1" />
        <Start value="Route_1" />
        <Offset value="1.0" unit="m" />
        <Lane value="right1" unit="" />
    </Initialize>
    <Initialize>
            <ObjectId value="Obj2" />
            <Start value="Route_1" />
            <Offset value="1.0" unit="m" />
            <Lane value="right2" unit="" />
    </Initialize>
</State>

我正在使用 lxml.etree 库来解析 XML sn-p。我的目标是通过元素的名称找到属性的值。 示例:我想从“ObjectId”中获取“值”。如果整个 xml 树中有多个“ObjectId”,我只想取第一个。在这种情况下,我想得到“Obj1”。

这就是我目前的做法:

import lxml.etree as LET
state = LET.XML("state.xml")
variable = "ObjectId"

for attribute in state.iter(variable):
    value = attribute.attrib.get("value")
    print(value)

是否有替代方法可以在所有 xml 级别上仅获取“ObjectId”的第一个“值”而不使用 for 循环?

感谢您的帮助!

【问题讨论】:

  • 您可以使用 xpath。 ObjectId 是否被假定存在

标签: python xml lxml


【解决方案1】:

见下文。只需使用find

import xml.etree.ElementTree as ET

xml = '''<State id="1">
    <Initialize>
        <ObjectId value="Obj1" />
        <Start value="Route_1" />
        <Offset value="1.0" unit="m" />
        <Lane value="right1" unit="" />
    </Initialize>
    <Initialize>
            <ObjectId value="Obj2" />
            <Start value="Route_1" />
            <Offset value="1.0" unit="m" />
            <Lane value="right2" unit="" />
    </Initialize>
</State>'''

root = ET.fromstring(xml)
print(root.find('.//ObjectId').attrib['value'])

输出

Obj1

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多