1. 程式人生 > >Python xml解析記錄

Python xml解析記錄

Python的xml解析方式自帶的有3種,xml.dom.*、xml.sax.*以及xml.etree.ElementTree,相對來說,xml.etree.ElementTree最快捷方便。

因為自己只使用了xml.etree.ElementTree,所以下面就簡單記錄下xml.etree.ElementTree相關的東西。

基本讀寫

xmlTree = ElementTree.parse('a.xml')  #讀入
	xmlNodeList = xmlTree.getiterator('Item')  #獲取指定節點
	for node in xmlNodeList:
		print 'node.tag:%s' % node.tag  #節點名
		print 'node.text:%s' % node.text  #節點文字
		if node.attrib.has_key('attr_name'):  #節點attribute
			print 'node.attrib[%s]:%s' % ('attr_name',node.attrib['attr_name']))
			keyPath = node.attrib['attr_name']


xml內含有namespace的坑

如果xml檔案有namespace的,ElementTree會修改namespace的名字,一般會改成ns0之類的,如果不希望被更改的話,這樣玩:
XML_NS_NAME = 'my_ns'
XML_NS_VALUE = 'http://xxx'
ElementTree.register_namespace(XML_NS_NAME, XML_NS_VALUE)  #在parse之前呼叫

有namespace的時候,查詢需要轉換namespace,比如有個節點的attr是:my_ns:name,那麼在ElementTree內部會解析成{http://xxx}name,所以查詢的時候也需要用{http://xxx}name才能找到。 附一個轉換函式:
#xml有namespace的轉換成正常可解析的值  有則轉換,沒有則返回原值
def ParseNameSpace(src, nsName, nsValue):
	if src.find(nsName) != -1:
		dst = src.replace('%s:' % nsName, '{%s}' % nsValue)
		print 'ns src:%s dst:%s' % (src, dst)
		return dst

	return src