簡體   English   中英

用python解析lxml:如何使用objectify

[英]lxml parsing with python: how to with objectify

我正在嘗試讀取spss文件后面的xml,我想從etree轉向對象化。

我如何在下面轉換此函數以返回一個對象化對象? 我想這樣做是因為Objectify xml對象對於我(作為新手)來說更容易使用,因為它具有更多的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

我的失敗嘗試:

def get_etree(path_file):

    from lxml import etree, objectify

    with open(path_file, 'r+') as f:
        xml_text = objectify.fromstring(xml)   

    return xml

但是我得到這個錯誤:

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

第一個最大的錯誤是將文件讀取為字符串並將該字符串提供給XML解析器。

Python將以默認文件編碼的任何形式讀取文件(除非在調用read()時指定了編碼),並且該步驟很可能會破壞除普通ASCII文件以外的任何內容。

XML文件采用多種編碼,您無法預測它們,因此您實際上不應對它們進行任何假設。 XML文件通過XML聲明解決了該問題。

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

XML解析器將讀取該信息位並在讀取文件的其余部分之前正確配置自身。 利用該功能。 切勿對XML文件使用open()read()

幸運的是,lxml使其非常容易:

from lxml import etree, objectify

def get_etree(path_file):
    return etree.parse(path_file, parser=etree.XMLParser(recover=True))

def get_objectify(path_file):
    return objectify.parse(path_file)

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>

PS:如果您確實必須積極使用恢復分析器,請認真考慮。 XML文件是一種數據結構。 如果它損壞了(從語法上講是無效的,不完整的,解碼錯誤的,請您給它命名),您是否真的想信任嘗試讀取它的(按定義未定義)結果,還是您寧願拒絕它並顯示錯誤消息?

我會做后者。 使用恢復分析器可能會在以后導致討厭的運行時錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM