Search code examples
pythonxmlminidom

Find a XML node with a specific child using minidom


I am looking for a way to filter this XML string and print the "identifiant" value where the "source" field is HAL.

    <sudoc service="idref2source">
        <query>
            <ppn>115565329</ppn>
            <result>
                <source>HAL</source>
                <identifiant>chl</identifiant>
            </result>
        </query>
        <query>
            <ppn>115565329</ppn>
            <result>
                <source>VIAF</source>
                <identifiant>http://viaf.org/viaf/202196105</identifiant>
            </result>
        </query>
    </sudoc>

I only parsed the string using minidom

dom = parseString(r.content)

Many thanks !


Solution

  • Below - 1 line of code

    import xml.etree.ElementTree as ET
    
    xml = '''
     <sudoc service="idref2source">
            <query>
                <ppn>115565329</ppn>
                <result>
                    <source>HAL</source>
                    <identifiant>chl</identifiant>
                </result>
            </query>
            <query>
                <ppn>115565329</ppn>
                <result>
                    <source>VIAF</source>
                    <identifiant>http://viaf.org/viaf/202196105</identifiant>
                </result>
            </query>
        </sudoc>
    '''
    
    root = ET.fromstring(xml)
    hals = [s.find('identifiant').text for s in root.findall('.//result/[source="HAL"]')]
    print(hals)