Ⅰ 如何用python輸出漂亮的xml文件
最近要用Python處理一個xml文件。平時習慣了用xml.etree.ElementTree,結果發現此庫存在一些讓人無法忍受的缺點:
1. 無法處理comment和cdata
2. 輸出後的xml文件沒有換行,沒有縮進,十分難以閱讀
於是嘗試這用xml.dom.minidom,前兩個問題幾乎全部解決了。唯一讓人看著不爽的是minidom對於text的處理。比如,我期待的xml輸入如下:
[html] view plain
<pre name="code" class="html"><pre name="code" class="html"><root>
<host>192.168.0.1</host>
</root>
但是使用xml.dom.minidom.Document.writexml後,輸出的結果卻是這樣的:
[html] view plain
<root>
<host>
192.168.0.1
</host>
</root>
開始的時候,我考慮重寫Document.writexml函數,覺得太麻煩,有用牛刀殺雞之感。後來想想,其實自己的需求非常簡單,只是需要對Document的輸出結果做個二次處理即可。使用python的正則表達式庫就可以實現:
[python] view plain
def save_xml(self, file_name):
xml_str = self.m_dom.toprettyxml(indent=" ")
repl = lambda x: ">%s</" % x.group(1).strip() if len(x.group(1).strip()) != 0 else x.group(0)
pretty_str = re.sub(r'>\n\s*([^<]+)</', repl, xml_str)
open(file_name, 'w').write(pretty_str)
先將Document輸出到字元串,然後使用正則表達式將text中的空行去掉即可。
黑馬程序員的PYthon是國內最早開設的真正人工智慧課程。課程全面系統,緊跟時代潮流。
Ⅱ 怎麼用python獲取xml文件的所有節點。
假如我們有個xml文檔如下:example.xml
<?xml version="1.0" encoding="UTF-8"?>
<BIT>
<GeneralDescription>
<name>Matlab</name>
<DateTime>2008-09-10 23:16:48</DateTime>
</GeneralDescription>
<AMatrix>1,2,3;4,5,6;7,8,9</AMatrix>
</BIT>
首先,要解析xml文檔,需要導入一個模塊
>>> from xml.dom.minidom import parse
(1)然後載入一個xml文檔
>>> xmldoc = parse("J:/homeword/example.xml")
>>> print xmldoc.toxml()
<?xml version="1.0" ?>
<BIT>
<GeneralDescription>
<name>Matlab</name>
<DateTime>2008-09-10 23:16:48</DateTime>
</GeneralDescription>
<AMatrix>1,2,3;4,5,6;7,8,9</AMatrix>
</BIT>
>>>
上面是可以查看這個文檔的內容。
Toxml方法列印出了node風格的xml,如果節點是Document結果,則列印出整個xml文檔。否則只列印出本節點所屬內容。
(2)如何獲取子節點
>>> xmldoc.childNodes
[<DOM Element: BIT at 0x1223af8>]
>>>
每一個node都有一個childNodes的屬性,他是一個node對象的列表,注意的是,一個Document只有一個子節點,上例中就是BIT這個節點,它屬於Document節點。
因為是列表,所以也可以同用列表索引,xmldoc.childNodes[0]
>>> BIT_element = xmldoc.firstChild
>>> BIT_element
<DOM Element: BIT at 0x1223af8>
>>> print BIT_element.toxml()
<BIT>
<GeneralDescription>
<name>Matlab</name>
<DateTime>2008-09-10 23:16:48</DateTime>
</GeneralDescription>
<AMatrix>1,2,3;4,5,6;7,8,9</AMatrix>
</BIT>
>>>
(3)獲得某一個節點的文本
>>> BIT_element.childNodes
[<DOM Text node "
">, <DOM Element: GeneralDescription at 0x1223be8>, <DOM Text node "
">, <DOM Element: AMatrix at 0x1223e40>, <DOM Text node "
">]
>>>name = (BIT_element.childNodes[1]).childNodes[1]
>>> >>> name.childNodes[0].data
u'Matlab'
>>>
Ⅲ python參數如果是xml字元串,該怎麼寫
調用Python腳本時傳遞XML字元串作為參數可能會導致錯誤,因為某些特殊字元可能被操作系統或Python解釋器解釋為命令或代碼。為配備升了避免這個問題,可以將XML字元串作為滾枝一個文本文件傳遞,或者使用base64編碼將字元串編碼為非特殊字元。下面是兩種方法的示例。
方法一:將XML字元串保存到文件,並將文件名作為參數傳遞:
將XML字元串保存到一個文件,例如input.xml。
修改Python腳本以接受文件名培老作為參數:
import sys
import xml.etree.ElementTree as ET
filename = sys.argv[1]
with open(filename, 'r') as file:
xml_string = file.read()
xml_root = ET.fromstring(xml_string)
調用腳本時傳遞文件名:python xxx.py input.xml
方法二:使用base64編碼:
對XML字元串進行base64編碼:
import base64
xml_string = '<?xml version="1.0" encoding="UTF-8"?>...'
encoded_xml = base64.b64encode(xml_string.encode()).decode()
修改Python腳本以接受base64編碼的字元串作為參數:
import sys
import base64
import xml.etree.ElementTree as ET
encoded_xml = sys.argv[1]
decoded_xml = base64.b64decode(encoded_xml.encode()).decode()
xml_root = ET.fromstring(decoded_xml)
調用腳本時傳遞base64編碼的字元串:python xxx.py "base64_encoded_string"
以上兩種方法都可以有效地避免在傳遞XML字元串時產生的錯誤。請根據實際需求選擇合適的方法。