Python/XML 子节点数

Python/XML number of child nodes

我想从 xml 文件下面得到的是: 如果 <term> 节点内的 <broader> 节点数 > 1 和 这些 <broader> 个节点的值中的任何一个等于 <id> 个节点的值 然后 打印 <value> 节点文本。

            <results>
            <term>
                <altLabel>
                    <value>Label1</value>
                </altLabel>
                <broader>11</broader>
                <id>1</id>
            </term>
            <term>
                <altLabel>
                    <value>Label2</value>
                </altLabel>
                <broader>22</broader>
                <broader>2</broader>
                <id>2</id>
            </term>
            <term>
                <altLabel>
                    <value>Label3</value>
                </altLabel>
                <broader>3</broader>
                <broader>33</broader>
                <id>3</id>
            </term>
            <term>
                <altLabel>
                    <value>Label4</value>
                </altLabel>
                <broader>44</broader>
                <broader>44</broader>
                <id>4</id>
            </term>
        </results>

所以对于上面的 XML 我想得到:

Label2
Label3

注意:<term> 节点内的子节点数量可能会有所不同。这只是一个示例 xml,因此我对指向 table.

的任何特定元素不感兴趣

你可以使用 BeautifulSoup 来循环遍历所有 term 标签,并检查它们的 id 文本是否等于它们的任何 broader 文本:

from bs4 import BeautifulSoup
soup = BeautifulSoup(doc, 'lxml') #  doc is your string
termList = soup.findAll("term")
for term in termList:
    if len(term.findAll("broader")) > 1:
        for broader in term.findAll("broader"):
            if term.id.text == broader.text:
                print(term.value.text)

将打印:

Label2
Label3

使用内置 xml 模块,语法与 beautifulsoup 非常相似 :)

path_to_xml替换为您的xml文件路径

from xml.etree import cElementTree as ET
xml_dat = ET.parse(path_to_xml).getroot()
for term in xml_dat.iter('term'):
    broaders = term.findall('broader')
    if len(broaders) > 1:
        for broader in broaders:
            if term.find('id').text == broader.text:
                print(term.find('altLabel').find('value').text)