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

时间:2020-06-02 08:38:57

标签: python xml minidom

我正在寻找一种过滤此XML字符串并在“源”字段为HAL的情况下打印“ identifiant”值的方法。

    <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)

非常感谢!

2 个答案:

答案 0 :(得分:0)

下面-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)

答案 1 :(得分:0)

Python的xml模块足以满足此要求,并与xpath结合使用-查找元素source,其文本为“ HAL”,并回溯到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'
相关问题