用python解析lxml:如何使用objectify

2024-10-02 22:29:36 发布

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

我试图读取spss文件后面的xml,我想从etree移到objectify。在

如何将下面的函数转换为返回objectify对象?我之所以这么做是因为objectifyxml对象对我(作为一个新手)来说更容易操作,因为它更像python。在

def get_etree(path_file):

    from lxml import etree

    with open(path_file, 'r+') as f:
        xml_text = f.read()     
    recovering_parser = etree.XMLParser(recover=True)    
    xml = etree.parse(StringIO(xml_text), parser=recovering_parser)

    return xml

我失败的尝试:

^{pr2}$

但我得到一个错误:

lxml.etree.XMLSyntaxError: xmlns:mdm: 'http://www.spss.com/mr/dm/metadatamodel/Arc 3/2000-02-04' is not a valid URI

Tags: 文件path对象函数textparserxmllxml
1条回答
网友
1楼 · 发布于 2024-10-02 22:29:36

第一个最大的错误是将文件读入字符串并将该字符串馈送给XML解析器。在

Python将以默认的文件编码方式读取文件(除非您在调用read()时指定了编码),而且该步骤很可能会破坏除普通ASCII文件之外的任何内容。在

XML文件有许多编码,您无法预测它们,而且您不应该对它们进行假设。XML文件用XML声明解决了这个问题。在

<?xml version="1.0" encoding="Windows-1252"?>

在读取文件的其余部分之前,XML解析器将读取这部分信息并正确配置自己。利用那个设施。不要将open()read()用于XML文件。

幸运的是,lxml使它变得非常简单:

^{pr2}$

以及

path = r"/path/to/your.xml"
xml1 = get_etree(path)
xml2 = get_objectify(path)

print xml1   # -> <lxml.etree._ElementTree object at 0x02A7B918>
print xml2   # -> <lxml.etree._ElementTree object at 0x02A7B878>

注:如果你真的,肯定地必须使用一个恢复解析器,那就好好想想。XML文件是一种数据结构。如果它被破坏(语法上无效,不完整,错误解码,你能说出它的名字),你真的想相信(根据定义未定义的)尝试读取它的结果还是你宁愿拒绝它并显示错误消息?在

我会做后者。使用恢复解析器可能会在以后导致严重的运行时错误。在

相关问题 更多 >