我的任务是将一些旧的XML解析代码重写为Python,但我偶然发现了cElementTree
的喜悦,我喜欢它,因为我可以在几行内完成很多工作。
我在xpath
方面的经验并不广泛,这个问题更多地是关于在结构上进行进一步钻探。
我在test.xml
中有这个
<?xml version="1.0"?>
<ownershipDocument>
<issue>
<ic>0000030305</ic>
<iname>DUCOMM</iname>
<its>DCP</its>
</issue>
<ndt>
<ndtran>
<tc>
<tft>4</tft>
<tc>P</tc>
<esi>0</esi>
</tc>
</ndtran>
<ndtran>
<tc>
<tft>4</tft>
<tc>P</tc>
<esi>0</esi>
</tc>
</ndtran>
</ndt>
</ownershipDocument>
我用Python编写了这个脚本:
import xml.etree.cElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
print root.tag
print root.attrib
for child in root:
print(child.tag, child.attrib)
for issue in root.findall('issue'):
ic = issue.find('ic').text
iname= issue.find('iname').text
print(ic,iname)
这给了我:
ownershipDocument
{}
('issue', {})
('ndt', {})
('0000030305', 'DUCOMM')
那成功地在“问题”中获取了我所需的信息。
问题是我需要访问多个“ ndtran”节点(在“ ndt”节点中)。解析时,我可以提取“ tft”,“ tc”和“ esi”值作为组,但是我需要遍历每个“ tc”节点,提取“ tft”,“ tc”,“ esi”值,然后将它们插入数据库,然后移至下一个“ tc”节点,然后再次进行操作。
我试图用来遍历每一个的是这样的:
for tc in root.findall("./ndt/ndtran/tc"):
tft = tc.find('tft').text
tc = tc.find('tc').text
esi = tc.find('esi').text
print(tft,tc,esi)
这几乎使我到达那里(我认为),但这确实给了我一个错误。
esi = tc.find('esi').text
AttributeError: 'int' object has no attribute 'text'
我希望这是有道理的。我相信我所追求的是DOM解析方法,这很好,因为这些文档并不大。
我感谢任何正确方向的建议或指点。
最佳答案
您在上一行将tc
属性的值替换为string
:
for tc in root.findall("./ndt/ndtran/tc"):
tft = tc.find('tft').text
tc = tc.find('tc').text
#^^ use different variable name here
esi = tc.find('esi').text
#^^ at this point, `tc` is no longer referencing the outer <tc> elements
有趣的巧合是,
string
也具有find()
方法,当找不到关键字时返回int
(-1
),因此'int'对象没有属性'text'错误。关于python - 使用cElementTree解析XML,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43082887/