我还没来得及抓到d就把这些元素清除了

2024-10-01 07:23:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Python来解析一个使用celementree和iterparse的大型XML文件(27GB)。我可以提取所有标记,但由于某些原因,没有检索到任何元素文本(它总是显示“none”)。我检查了文件和堆栈溢出,但没有结果。作为最后的手段,我尝试使用lxml进行解析,但如果可能的话,我更愿意在cElementree上进行解析。 更新:当我评论出元素清除()行它显示正在解析的数据,但现在我试图弄清楚为什么clear()方法在打印数据之前擦除数据(最终我希望将数据放入一个单独的数据结构,如数据库)。我假设我需要清除数据,这样我就不会在文件解析过程中耗尽内存。这是那种“Python中的一切都是对象”的情况吗?你知道吗

使用从文件中提取的较小样本,我仍然得到相同的错误。XML文件看起来像这样(尽管有更多的条目):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><entityList><entity 
xmlns:ns2="urn:hl7-org:v3" xmlns:ns3="urn:axolotl-com:pdo">
<fragmentId>d68e616e-a6bc-4630-b104-3891859a8ce4</fragmentId>
<aggregateId>H1060734453</aggregateId>
<source>b6167864-5f74-40e5-97c5-7e551a3a4a7d</source>
<sourceName>SHM ADT</sourceName>
<sourceOid>2.16.840.1.113883.3.2.2.3.1.21.3</sourceOid>
<sourceAaoid>2.16.840.1.113883.3.62.2</sourceAaoid>
</entity></entityList>

下面是一段行为不端的代码:

import xml.etree.ElementTree as etree
xml=r'C:\sample.xml'

count = 0

for event, elem in etree.iterparse(xml):
    if event == 'end':
        if elem.tag == 'entity':
            count+=1        
                for child in elem:
                    print (child.tag, child.attrib, child.text)
    elem.clear()
print(count)

我要走了

fragmentId {} None
aggregateId {} None
source {} None
sourceName {} None
sourceOid {} None
sourceAaoid {} None

为什么会这样元素清除()擦除文本,即使看起来应该先打印?有什么建议吗?你知道吗


Tags: 文件数据nonechild元素sourcexmlentity
1条回答
网友
1楼 · 发布于 2024-10-01 07:23:34

这是我将如何做到这一点,我也不知道你想做什么与数据 所以我只是把它印成你的样子:

import xml.etree.ElementTree as ET

tree = ET.parse(path_to_xml)
root = tree.getroot()

def tree_parser(root):
    for child in root.getchildren():
        if not child.getchildren():
            print(child.tag, child.text)
        else:
            tree_parser(child)

tree_parser(root) 

fragmentId d68e616e-a6bc-4630-b104-3891859a8ce4
aggregateId H1060734453
source b6167864-5f74-40e5-97c5-7e551a3a4a7d
sourceName SHM ADT
sourceOid 2.16.840.1.113883.3.2.2.3.1.21.3
sourceAaoid 2.16.840.1.113883.3.62.2

根据您的意见:

def tree_parser(root, seen=set()):
    for child in root.getchildren():
        if not child.getchildren():
            data = (child.tag, child.text)
            seen.add(data)
        else:
            tree_parser(child, seen)
    return seen

for _, element in etree.iterparse(path_to_xml):
    c = tree_parser(element)

print(c)

{('aggregateId', 'H1060734453'),
 ('fragmentId', 'd68e616e-a6bc-4630-b104-3891859a8ce4'),
 ('source', 'b6167864-5f74-40e5-97c5-7e551a3a4a7d'),
 ('sourceAaoid', '2.16.840.1.113883.3.62.2'),
 ('sourceName', 'SHM ADT'),
 ('sourceOid', '2.16.840.1.113883.3.2.2.3.1.21.3')}

相关问题 更多 >