3 回答

TA貢獻1770條經(jīng)驗 獲得超3個贊
此行為在過去已作為錯誤提出,并已解決為“不會修復(fù)”。
ElementTree模塊作者點評
對于 ET,[這種行為] 是故意的。驗證每個應(yīng)用程序提供的數(shù)據(jù)會降低所有應(yīng)用程序的性能,即使只有一小部分人會嘗試序列化無法用 XML 表示的數(shù)據(jù)。
結(jié)束評論(由lxml的維護者,同時也是 Python 核心開發(fā)人員撰寫)包括以下觀察:
這是一個棘手的決定。例如,lxml 驗證用戶輸入,但那是因為它無論如何都必須處理它,并且直接在輸入時進行處理(并且在 C 代碼中非常有效)。另一方面,ET 對于允許用戶執(zhí)行的操作相當(dāng)寬松,并且不會對用戶輸入進行太多處理。它甚至在處理過程中允許無效的樹,并且只期望樹在被請求序列化時是可序列化的。
我認(rèn)為這是一種公平的行為,因為大多數(shù)用戶輸入都可以,并且不需要承受驗證所有輸入的性能損失。例如,空字符在文本中很少見,我認(rèn)為讓用戶自己處理可能出現(xiàn)的少數(shù)情況是合理的。
...
最后,真正關(guān)心正確輸出的用戶應(yīng)該在序列化后對其運行某種模式驗證,因為這不僅會檢測數(shù)據(jù)問題,還會檢測結(jié)構(gòu)和邏輯問題(例如缺失或空屬性),特別是針對他們的目標(biāo)數(shù)據(jù)格式。在某些情況下,它甚至可能檢測到由于服務(wù)器計算機中的舊非 ECC RAM 而導(dǎo)致的隨機數(shù)據(jù)損壞。:)
...
所以總而言之,ET.tostring
將生成格式不正確的 xml,這是設(shè)計使然。如有必要,可以使用ET.fromstring
或其他解析器解析輸出以檢查其格式是否正確。或者,可以使用 lxml 代替 ElementTree。

TA貢獻1725條經(jīng)驗 獲得超8個贊
作為我自己的解決方法,我編寫了一個輔助方法來在保存到 XML 模型之前清除受限字符:
def clean(str): return re.sub(r'[^\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD\u10000-\u10FFF]+', '', str)
添加回答
舉報