簡體   English   中英

lxml:不解析子樹而是將其視為二進制內容

[英]lxml: Do not parse subtree but treat as binary content

我正在處理包含元素的 XML 內容,這些元素可能將格式錯誤的 XML/類似標記(例如 HTML)的內容保存為文本。 例如:

<root>
    <data>
        <x>foo<y>bar</y>
    </data>
    <data>
        <z>foo<y>bar</y>
    </data>
</root>

目標:我希望lxml.etree不嘗試將data元素下的任何內容解析為 XML,而是簡單地將其作為bytesstr (可以在elem.text )返回。

文件很大,我想使用lxml.etree.iterparse來提取data元素中的內容。

最初的想法:獲取元素內容(在本例中包含data開始和結束標簽)的直接方法可能是:

data = BytesIO(b"""
<root>
    <data>
        <x>foo<y>bar</y>
    </data>
    <data>
        <z>foo<y>bar</y>
    </data>
</root>
""")

from lxml import etree

# see below why html=True
context = etree.iterparse(data, events=("end",), tag=("data",), html=True)
contents = []  # I don't keep lists in the "real" application
for event, elem in context:
    contents.append(etree.tostring(elem))  # get back the full content underneath data

這樣做的問題lxml.etree可能會遇到解析data子項的問題(例如:當html -data 存儲在data下時,我已經不得不使用html=True來避免遇到問題)。 我知道lxml中有自定義元素類,但從我對文檔的理解lxml.etree ,它們不會改變lxml.etreelibxml2決定的解析行為)。

有什么簡單的方法可以告訴lxml不要嘗試將元素內容解析為子元素。 應用程序本身受益於其他lxml功能,如果我單獨為data編寫自定義提取器,我將不得不復制這些功能。

或者有沒有辦法使用 XSLT 首先轉換輸入以在lxml進行處理,然后再鏈接回數據?

這是否按預期工作? 通過添加 DTD 和 CDATA 來修改 XML,以指定必須將數據元素內的內容視為字符數據。

data = io.BytesIO(B'''<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE root [
<!ELEMENT root (data+)>
<!ELEMENT data (#PCDATA)>
]>

<root>
    <data>
        <![CDATA[
        <x>foo<y>bar</y>
        ]]>
    </data>
    <data>
        <![CDATA[
        <z>foo<y>bar</y>
        ]]>
    </data>
</root>

''')

from lxml import etree

# see below why html=True
context = etree.iterparse(data, events=("end",), tag=("data",), dtd_validation=True, load_dtd=True)
contents = []  # I don't keep lists in the "real" application
for event, elem in context:
    contents.append(etree.tostring(elem))  # get back the full content underneath data

暫無
暫無

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

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