我正在尝试解析一个 xml 文件,以便我可以操作其中包含的数据。
有900万行,所以我不会发布它。
这是我的代码:
from lxml import etree
parser = etree.XMLParser(recover = True, encoding = 'utf-16')
tree = etree.parse('xml_parts.xml', parser)
ns = {'d': 'http://www.w3.org/2001/XMLSchema-instance'}
tree.find('d:database', ns)
这是 xml 文件的第一部分(它是 utf-16 编码的,但未在标头中指定):
<?xml version="1.0"?>
<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<database name="parts_bbdb">
<table_structure name="parts">
<field Field="part_id" Type="int(11)" Null="NO" Key="PRI" Extra="auto_increment" Comment="" />
我收到的错误是:
Traceback (most recent call last):
File "./AtomParse", line 13, in <module>
tree.find('{http://www.w3.org/2001/XMLSchema-instance}database')
File "src/lxml/etree.pyx", line 2208, in lxml.etree._ElementTree.find (src/lxml/etree.c:68635)
File "src/lxml/etree.pyx", line 1876, in lxml.etree._ElementTree._assertHasRoot (src/lxml/etree.c:65215)
AssertionError: ElementTree not initialized, missing root
我以前从未解析过 XML,但通过阅读 lxml 文档,我认为这应该可行。
我知道 XML 文件的整体结构,一旦我能够访问元素的属性,我就可以接受它,但出现了一些初期问题。
如果有人能指出我正确的方向,那就太好了,谢谢!
编辑:
<row>
<field name="part_id">2557</field>
<field name="ok">0</field>
<field name="part_name">BBa_S01288</field>
<field name="short_desc">Intermediate part from assembly 236</field>
<field name="description" xsi:nil="true" />
<field name="part_type">Intermediate</field>
<field name="author">Randy Rettberg</field>
<field name="owning_group_id">7</field>
<field name="status">Deleted</field>
<field name="dominant">0</field>
<field name="informational">0</field>
<field name="discontinued">1</field>
<field name="part_status"></field>
<field name="sample_status">Discontinued</field>
<field name="p_status_cache"></field>
<field name="s_status_cache"></field>
<field name="creation_date">2003-12-03</field>
<field name="m_datetime">2015-05-08 14:14:17</field>
<field name="m_user_id">0</field>
<field name="uses">0</field>
<field name="doc_size">686</field>
<field name="works"></field>
<field name="favorite">0</field>
<field name="specified_u_list">_149_156_603_145_193_147_161_603_145_</field>
<field name="deep_u_list">_149_156_603_145_193_147_161_603_145_</field>
<field name="deep_count">9</field>
<field name="ps_string" xsi:nil="true" />
<field name="scars"></field>
<field name="default_scars"></field>
<field name="owner_id">24</field>
<field name="group_u_list">_1_</field>
<field name="has_barcode">0</field>
<field name="notes" xsi:nil="true" />
<field name="source"></field>
<field name="nickname"></field>
<field name="categories">//classic/intermediate/uncategorized</field>
<field name="sequence">tcacacaggaaa</field>
<field name="sequence_sha1">÷?¾TŸ]°f ÜèÕ?]Mò</field>
<field name="sequence_update">5</field>
<field name="seq_edit_cache"><script
在上面的代码中,我相信编码问题来自“sequence_sha1”中从底部开始的第三行。有 400000 个这样的块,每个块都有这样的一行。
您是否尝试使用“”关闭文件末尾的根目录?