Найдите атрибут на основе имени элемента в XML на всех уровнях

#python #xml #lxml

Вопрос:

Это 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. Моя цель-найти значение атрибута по имени его элемента.
Пример: Я хочу получить «значение» из «ObjectId». Если во всем xml-дереве есть несколько «объектов», я хочу выбрать только первый. В этом случае я хотел бы получить в результате «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)
 

Есть ли альтернатива получить только самое первое «значение» «ObjectId» на всех уровнях xml без использования цикла for?

Спасибо за вашу помощь!

Комментарии:

1. вы могли бы использовать xpath. Является ли объект, как предполагается, существующим

Ответ №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