gpt4 book ai didi

python - 使用 cElementTree 解析 XML

转载 作者:行者123 更新时间:2023-12-01 03:08:57 25 4
gpt4 key购买 nike

我的任务是用 Python 重新编写一些旧的 XML 解析代码,我偶然发现了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com