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