我有三个XML文件(下面的示例).我已经用各自的audioId属性值命名了文件.因此,有问题的文件将称为93.xml和2137.xml:
93.xml:
<word BloomsTaxonomy="1,2,3" DictationGroupid="i-e combination List 7" Stage="0" Use="P,L" audioId="93" />
2173.xml:
<word BloomsTaxonomy="1,2,3" DictationGroupid="i-e combination List 7" Stage="0" Use="P,L" audioId="2137" />
mainDataSet.xml:
<word id="2137" title="over" level="1" grouping="Sight Words" YRule="0" MagicE="0" SoftC="0" doublevowel="0" longvowel="0" displayorder="101" silentletters="0"/>
文件mainDataSet.xml包含约3,000个条目.为了这个问题,我仅提供了一个条目.
我的问题是关于如果两个文件中的ID都匹配(或者即使mainDataSet.xml中的ID与文件名匹配),我如何将mainDataSet.xml中的title属性附加到mainDataSet.xml中的2173.xml中的word标签上. .例如,在我提供的示例中,输出应为:
<word BloomsTaxonomy="1,2,3" DictationGroupid="i-e combination List 7" Stage="0" Use="P,L" audioId="2137" title="over" />
要从mainDataSet.xml解析我的XML,我目前正在做:
e = xml.etree.ElementTree.parse('mainDataSet.xml').getroot()
for atype in e.findall('word'):
print(atype.get('title'))
解决方法:
要添加属性,请使用.attrib
字典.这是一个示例代码,它循环遍历mainDataSet.xml内部的word元素,检索id属性值,解析适当的XML文件(在这种情况下为93.xml和2173.xml),更新word元素并将树转储回去到文件:
import xml.etree.ElementTree as ET
e = ET.parse('mainDataSet.xml').getroot()
for word in e.findall('word'):
word_id = word.attrib.get("id")
if word_id:
filename = "%s.xml" % word_id
e_word = ET.parse(filename)
e_word.getroot().attrib['title'] = word.attrib.get('title')
e_word.write(filename)
我使用的样本mainDataSet.xml:
<words>
<word id="2137" title="over" level="1" grouping="Sight Words" YRule="0" MagicE="0" SoftC="0" doublevowel="0" longvowel="0" displayorder="101" silentletters="0"/>
<word id="93" title="something else" level="1" grouping="Sight Words" YRule="0" MagicE="0" SoftC="0" doublevowel="0" longvowel="0" displayorder="101" silentletters="0"/>
</words>
这是运行脚本后得到的信息:
> 93.xml:
<word BloomsTaxonomy="1,2,3" DictationGroupid="i-e combination List 7" Stage="0" Use="P,L" audioId="93" title="something else" />
> 2173.xml:
<word BloomsTaxonomy="1,2,3" DictationGroupid="i-e combination List 7" Stage="0" Use="P,L" audioId="2137" title="over" />