我正在使用minidomfromxml.dom來決議 xml 檔案。我對其進行了一些更改,然后將其重新匯出回新的 xml 檔案。該檔案由程式生成作為匯出,我使用更改后的檔案作為匯入。匯入后,程式告訴我缺少CDATA節點并且無法匯入。
我簡化了我的代碼來測驗這個程序:
from xml.dom import minidom
filename = 'Test.xml'
dom = minidom.parse(filename)
with open( filename.replace('.xml','_Generated.xml'), mode='w', encoding='utf8' ) as fh:
fh.write(dom.toxml())
將其用于 Test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<![CDATA[]]>
</body>
這就是 Text_Generated.xml 檔案的內容:
<?xml version="1.0" ?><body>
</body>
一個簡單的解決方案是首先打開檔案并更改所有空CDATA節點以在決議之前包含一些值,然后在生成后從新檔案中洗掉值,但這似乎是不必要的作業和執行時間,因為其中一些檔案包含數萬個線。
我將問題部分除錯到了explatbuilder.py它的決議器。決議器安裝了自定義回呼。處理來自CDATA節點的資料的回呼是character_data_handler_cdata方法。提供給此方法的資料在決議后已丟失。
有人知道這是怎么回事嗎?
uj5u.com熱心網友回復:
遺憾的是,XML 規范并未 100% 明確說明檔案中的重要資訊和干擾資訊。但是有一個相當廣泛的共識,即CDATA標簽除了分隔未轉義的文本外沒有任何作用:so%和%and是%撰寫<!CDATA[%]]>相同內容的不同方式,無論您在輸入中使用哪種方式,XML 決議器都會產生相同的輸出。根據該假設,空<!CDATA[]]>表示“無內容”,決議器會將其洗掉。
如果您的檔案設計對 CDATA 標記具有重要意義,那么它與大多數 XML 工具遵循的慣例不一致,最好修改設計以改為使用元素標記。
話雖如此,許多 XML 決議器確實可以選擇向應用程式報告 CDATA 標記,因此您可以找到解決此問題的方法,但這仍然不是一個好的設計選擇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/536420.html
