我的任务是将一些旧的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/

10-13 04:11