pythonxmlpython-3.xtreenode

Read subelement of node values of an xml in python


I am using xml.etree.ElementTree to read an xml file which contains a list of teams and its members. I want to access a member name.

-<xml>
    -<teams>
        -<team>
            -<members>
               -<member1>
                   <style>Name1</style>
               </member1>
               -<member2>
                   <style>Name2</style>
               </member2>
               -<member3>
                   <style>Name3</style>
               </member3>
             </members>
        -</team>
        -<team>
        …
        -<team>
        -</team>
        …
        -<team>
        -</team>
    -</teams>
-</xml>

I use the codes below to get member name:

    import xml.etree.ElementTree as ET 
    tree = ET.parse(infile)
    root = tree.getroot()
    for child in root[0]:
        for node in child:
            if node.tag=="members":
                for _member in node.iter("style"):
                    print(_member.text)

These codes solve problem partially. Indeed, It is much efficient to access the tag member1 directly. Is there any way?


Solution

  • xml.etree.ElementTree has a limited XPath support but it is enough in this case:

    for name in root.findall(".//team/members/*/style"):
        print(name.text)
    

    Demo:

    >>> import xml.etree.ElementTree as ET
    >>> 
    >>> tree = ET.parse("test.xml")
    >>> root = tree.getroot()
    >>> 
    >>> for name in root.findall(".//team/members/*/style"):
    ...     print(name.text)
    ... 
    Name1
    Name2
    Name3