使用 minidom 查找具有特定子节点的 XML 节点

Find a XML node with a specific child using minidom

我正在寻找一种方法来过滤此 XML 字符串并打印 "identifiant" 值,其中 "source" 字段是 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>

我只使用 minidom 解析了字符串

dom = parseString(r.content)

非常感谢!

以下 - 1 行代码

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)

Python 的 xml module is sufficient for this, in combination with xpath - 找到文本为“HAL”的元素 source,ping 回 parent 元素并选择 identifiant 该父元素中的元素。请注意,我在这里使用 find,而不是 findall,因为您的问题专门针对共享 xml - 如果它是一个较大的文件,您可以 运行 使用 findall :

import xml.etree.ElementTree as ET

xml = """[your data above here]"""

root = ET.fromstring(xml)

root.find(".//source[.='HAL']/..//identifiant").text

'chl'