亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python ElementTree 生成格式不正確的帶有特殊字符 '\x0b' 的 XML 文件

Python ElementTree 生成格式不正確的帶有特殊字符 '\x0b' 的 XML 文件

呼喚遠方 2022-12-14 21:16:17
我曾經ElementTree生成帶有'\x0b'特殊字符的xml,然后minidom用來解析它。它會拋出not well-formed錯誤。import xml.etree.ElementTree as ETfrom xml.dom import minidomroot = ET.Element('root')root.text='\x0b'xml = ET.tostring(root, 'UTF-8')print(xml)pretty_tree = minidom.parseString(xml)生成的 XML:<root>\x0b</root>錯誤:Traceback (most recent call last):  File "testXml.py", line 7, in <module>    pretty_tree = minidom.parseString(xml)  File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/xml/dom/minidom.py", line 1968, in parseString    return expatbuilder.parseString(string)  File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/xml/dom/expatbuilder.py", line 925, in parseString    return builder.parseString(string)  File "/usr/local/Cellar/python/3.7.7/Frameworks/Python.framework/Versions/3.7/lib/python3.7/xml/dom/expatbuilder.py", line 223, in parseString    parser.Parse(string, True)xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 6
查看完整描述

3 回答

?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

此行為在過去已作為錯誤提出,并已解決為“不會修復”。

ElementTree模塊作者點評

對于 ET,[這種行為] 是故意的。驗證每個應用程序提供的數據會降低所有應用程序的性能,即使只有一小部分人會嘗試序列化無法用 XML 表示的數據。

結束評論(由lxml的維護者,同時也是 Python 核心開發人員撰寫)包括以下觀察:

這是一個棘手的決定。例如,lxml 驗證用戶輸入,但那是因為它無論如何都必須處理它,并且直接在輸入時進行處理(并且在 C 代碼中非常有效)。另一方面,ET 對于允許用戶執行的操作相當寬松,并且不會對用戶輸入進行太多處理。它甚至在處理過程中允許無效的樹,并且只期望樹在被請求序列化時是可序列化的。

我認為這是一種公平的行為,因為大多數用戶輸入都可以,并且不需要承受驗證所有輸入的性能損失。例如,空字符在文本中很少見,我認為讓用戶自己處理可能出現的少數情況是合理的。

...

最后,真正關心正確輸出的用戶應該在序列化對其運行某種模式驗證,因為這不僅會檢測數據問題,還會檢測結構和邏輯問題(例如缺失或空屬性),特別是針對他們的目標數據格式。在某些情況下,它甚至可能檢測到由于服務器計算機中的舊非 ECC RAM 而導致的隨機數據損壞。:)

...

所以總而言之,ET.tostring將生成格式不正確的 xml,這是設計使然。如有必要,可以使用ET.fromstring或其他解析器解析輸出以檢查其格式是否正確?;蛘撸梢允褂?lxml 代替 ElementTree。


查看完整回答
反對 回復 2022-12-14
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

\x0b是 XML 限制字符。這個問題的答案中對有效字符和受限字符有很好的描述。



查看完整回答
反對 回復 2022-12-14
?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

作為我自己的解決方法,我編寫了一個輔助方法來在保存到 XML 模型之前清除受限字符:

def clean(str):
  return re.sub(r'[^\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD\u10000-\u10FFF]+', '', str)


查看完整回答
反對 回復 2022-12-14
  • 3 回答
  • 0 關注
  • 260 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號