簡體   English   中英

如何使用 Python 元素樹生成帶有 BOM 的 XML、UTF-8?

[英]How to generate XML, UTF-8 with BOM using Python Element Tree?

要為 ASP.NET 生成資源 XML 文件,第三方工具需要 BOM(遷移到工具的新版本時)。 同時需要XML prolog like <?xml version='1.0' encoding='utf-8'?>

問題是當使用 ElementTree 命令時...

tree.write(lang_resx_fpath, encoding='utf-8')

生成的文件不包含 BOM。 使用命令時...

tree.write(lang_resx_fpath, encoding='utf-8-sig')

結果確實包含 BOM; 但是, XML prolog 包含encoding='utf-8-sig'

我應該如何生成包含 BOM 和encoding='utf-8'文件?

更新:

我已經通過再次讀取、替換和寫入文件來解決它,就像這樣......

with open(lang_resx_fpath, 'r', encoding='utf-8-sig') as f:
    content = f.read()

content = content.replace("encoding='utf-8-sig'", "encoding='utf-8'")

with open(lang_resx_fpath, 'w', encoding='utf-8-sig') as f:
    f.write(content)

無論如何,有沒有更清潔的解決方案?

窺視 ElementTree.write 的來源表明 prolog 在那里被硬編碼( https://github.com/python/cpython/blob/main/Lib/xml/etree/ElementTree.py或永久鏈接Z5E056C500A1C508/07BADE5Z11 /cpython/blob/ee0ac328d38a86f7907598c94cb88a97635b32f8/Lib/xml/etree/ElementTree.py )。 因此,可能使用 ET 的內部是唯一的選擇(除了猴子路徑模塊),編寫所需的序言並將 BOM 保存在文件中:

import xml.etree.ElementTree as ET
qnames, namespaces = ET._namespaces(tree._root, None)
with open(lang_resx_fpath,'w',encoding='utf-8-sig') as f:
    f.write("<?xml version='1.0' encoding='utf-8'?>\n"     )
    ET._serialize_xml(f.write,
                        tree._root, qnames, namespaces,
                       short_empty_elements=False)

可能它並不比您的解決方案更優雅(甚至可能更不優雅)。 唯一的好處是它不需要兩次寫入文件,除了一些巨大的 XML 文件之外,這將是次要的好處。

暫無
暫無

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

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