Python / XML子节点数

时间:2017-07-19 21:55:18

标签: python xml xhtml

我想从xml文件下面得到的是: 如果<broader>节点内的<term>个节点数> 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,因此我对指向表的任何特定元素不感兴趣。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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