一、說明
python中我們經常借助xml.etree.ElementTree對xml進行處理,其中ElementTree.fromstring()將字符串格式化成et對象,ElementTree.tostring()將et對象轉回字符串。
但ElementTree.tostring()轉回字符串時,有可能會出現標簽從<config>變為<ns0:config>或<s:config>變為<ns0:config>的情況,尤其在處理soap請求的時候。
二、處理辦法
暫時還沒搞清楚什么情況會變什么情況不會變,但處理辦法就是使用ElementTree.register_namespace()注冊命名空間。
直接使用stackoverflow的回答(https://stackoverflow.com/questions/8983041/saving-xml-files-using-elementtree):
從效果上個人理解為:
如果父標簽的那堆xmlns中有這些url,那么如果其子孫標簽中如果有“ows”這些前輟,要認為這些前輟是合法的不要去改變他們(即不要改成ns0等);第一個‘’表示空前輟。
另外注意兩點:
一是那些url並不(一定)是什么存在標准規范的urlET也不會去訪問這些url,url就是ET分析xml時當標志使用亂來也是可以的,只要要分析xml和register_namespace的url一致即可。
二是soap也是xml,所以ElementTree處理soap引起標簽改變也同這里一樣用register_namespace處理即可。
三、效果演示
直接ElementTree.fromstring()-ElementTree.tostring()引起標簽自動添回ns0前輟如下:
ElementTree.fromstring()-ElementTree.tostring()前插入ET.register_namespace('', "http://www.ipc.com/ver10"),結果轉回正常如下:
參考:
https://stackoverflow.com/questions/8983041/saving-xml-files-using-elementtree