Python/XML子节点数

2024-10-01 11:29:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从下面的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,我想得到:

^{pr2}$

注意:<term>节点内的子节点数可能会有所不同。这只是一个示例xml,所以我对指向表的任何特定元素不感兴趣。在


Tags: 文件文本gtid节点valuexmlresults
2条回答

使用内置的xml模块,sytax非常类似于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)

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

将打印:

^{pr2}$

相关问题 更多 >