3 回答

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

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