Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/XML子节点数_Python_Xml_Xhtml - Fatal编程技术网

Python/XML子节点数

Python/XML子节点数,python,xml,xhtml,Python,Xml,Xhtml,我想从下面的xml文件中得到的是: 如果节点>1内的节点数 及 任何一个节点的值都等于节点的值 然后 打印节点文本 <results> <term> <altLabel> <value>Label1</value> </altLabel> &l

我想从下面的xml文件中得到的是: 如果
节点>1内的
节点数 及 任何一个
节点的值都等于
节点的值 然后 打印节点文本

            <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,因此我对表中的任何特定元素都不感兴趣。

您可以使用
BeautifulSoup
来循环所有
术语
标记,并检查它们的id文本是否等于它们的任何
更广泛的
文本:

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
使用内置模块,sytax与beautifulsoup非常相似:)

将路径替换为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)

为什么
Label4
不是您预期结果的一部分?因为Label4'broader'节点的非属性=Label4'id'节点。这还不够。请注意“较宽节点数”必须大于1的条件。哦,有可能在
术语
中没有
较宽
标记?我不知道,因为我专注于这个例子,对不起。我会尽快编辑它。@misio_jasio我想现在就开始吧!谢谢你的评论!:因此,在“术语”节点中可能没有“更广泛”的节点。
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)