Python處理XML格式資料的方法詳解

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

本文例項講述了Python處理XML格式資料的方法。分享給大家供大家參考,具體如下:

這裡的操作是基於Python3平臺。

在使用Python處理XML的問題上,首先遇到的是編碼問題。

Python並不支援gb2312,所以面對encoding=”gb2312″的XML檔案會出現錯誤。Python讀取的檔案本身的編碼也可能導致丟擲異常,這種情況下開啟檔案的時候就需要指定編碼。此外就是XML中節點所包含的中文。

我這裡呢,處理就比較簡單了,只需要修改XML的encoding頭部。


#!/usr/bin/env python
import os, sys
import re
def replaceXmlEncoding(filepath, oldEncoding='gb2312', newEncoding='utf-8'):
f = open(filepath, mode='r')
content = f.read()
content = re.sub(oldEncoding, newEncoding, content)
f.close()
f = open(filepath, mode='w')
f.write(content)
f.close()
if __name__ == "__main__":
replaceXmlEncoding('./ActivateAccount.xml')

接著是使用xml.etree.ElementTree來操作XML檔案。

在一個類裡面定義__call__函式可以使得該類可呼叫,比如下面程式碼的最後幾行,在__main__函式中。這也很突出地體現了在Python的世界裡,一切都是物件,包括物件本身 :)

一直覺得__main__函式用來測試真是蠻好用的。


#!/usr/bin/env python
import os, re
import xml.etree.ElementTree as etree
Locale_Path = "./locale.txt"
class xmlExtractor(object):
def __init__(self):
pass
def __call__(self, filepath):
retDict = {}
f = open(filepath, 'r')
Line = len(open(filepath, 'r').readlines())
retDict['Line'] = Line
tree = etree.parse(f)
root = tree.find("ResItem")
Id = root.get("ID")
retDict['Title'] = Id
resItemCnt = len(list(root.findall("ResItem")))   1
retDict['ResItemCount'] = resItemCnt
retDict['ChineseTip'] = 'None'
for child in root:
attrDict = child.attrib
keyword = "Name"
if(keyword in attrDict.keys() and attrDict['Name'] == "Caption"):
if len(child.attrib['Value']) > 1:
if child.attrib['Value'][0] == '~':
title = child.attrib['Value'][1:]
else:
title = child.attrib['Value'][0:]
#print(title)
chs = open(Locale_Path).read()
pattern = '<String id="'   title   '">[^>] >'
m = re.search(pattern, chs)
if m != None:
realTitle = re.sub('<[^>] >', '', m.group(0))
retDict['ChineseTip'] = realTitle
f.close()
return retDict
if __name__ == "__main__":
fo = xmlExtractor()
d = fo('./ActivateAccount.xml')
print(d)

最後,就是入口檔案,匯入上面兩個檔案,使用xml.dom和os.listdir來遞迴處理XML檔案,並生成一個結果集。

一直覺得Python的UnboundLocalError錯誤挺有意思的,不知道是不是符號表的覆蓋問題。


#!/usr/bin/env python
from xmlExtractor import *
from replaceXmlEncoding import *
from xml.dom import minidom,Node
doc = minidom.Document()
extractor = xmlExtractor()
totalLines = 0
totalResItemCnt = 0
totalXmlFileCnt = 0
totalErrorCnt = 0
errorFileList = []
xmlRoot = doc.createElement("XmlResourceFile")
doc.appendChild(xmlRoot)
def myWalkDir(level, path):
global doc, extractor, totalLines, totalResItemCnt, totalXmlFileCnt
global totalErrorCnt, errorFileList
global xmlRoot
for i in os.listdir(path):
if i[-3:] == 'xml':
totalXmlFileCnt  = 1
try:
#先把xml的encoding由gb2312轉換為utf-8
replaceXmlEncoding(path   '\\'   i)
#再提取xml文件中需要的資訊
info = extractor(path   '\\'   i)
#在上述兩行程式碼沒有出現異常的基礎上再建立節點
#print(info)
#print(type(i))
xmlNode = doc.createElement("XmlFile")
xmlRoot.appendChild(xmlNode)
xmlName = doc.createElement("Filename")
xmlName.setAttribute('Value', i)
#xmlName.appendChild(doc.createTextNode(i))
xmlNode.appendChild(xmlName)
filePath = doc.createElement("Filepath")
filePath.setAttribute('Value', path[34:])
#filePath.appendChild(doc.createTextNode(path[1:]))
xmlNode.appendChild(filePath)
titleNode = doc.createElement("Title")
titleNode.setAttribute('Value', str(info['Title']))
#titleNode.appendChild(doc.createTextNode(str(info['Title'])))
xmlNode.appendChild(titleNode)
chsNode = doc.createElement("ChineseTip")
chsNode.setAttribute('Value', str(info['ChineseTip']))
#chsNode.appendChild(doc.createTextNode(str(info['Chinese'])))
xmlNode.appendChild(chsNode)
resItemNode = doc.createElement("ResItemCount")
resItemNode.setAttribute('Value', str(info['ResItemCount']))
#resItemNode.appendChild(doc.createTextNode(str(info['ResItemCount'])))
xmlNode.appendChild(resItemNode)
lineNode = doc.createElement("LineCount")
lineNode.setAttribute('Value', str(info['Line']))
#lineNode.appendChild(doc.createTextNode(str(info['Line'])))
xmlNode.appendChild(lineNode)
descNode = doc.createElement("Description")
descNode.setAttribute('Value', '')
#descNode.appendChild(doc.createTextNode(''))
xmlNode.appendChild(descNode)
except Exception as errorDetail:
totalErrorCnt  = 1
errorFileList.append(path   '\\'   i)
print(path   '\\'   i, errorDetail)
if os.path.isdir(path   '\\'   i):
myWalkDir(level 1, path   '\\'   i)
if __name__ == "__main__":
path = os.getcwd()   '\\themes'
myWalkDir(0, path)
print(totalXmlFileCnt, totalErrorCnt)
#print(doc.toprettyxml(indent = "  "))
resultXml = open("./xmlResourceList.xml", "w")
resultXml.write(doc.toprettyxml(indent = "  "))
resultXml.close()

PS:這裡再為大家提供幾款關於xml操作的線上工具供大家參考使用:

線上XML/JSON互相轉換工具:
http://tools.jb51.net/code/xmljson

線上格式化XML/線上壓縮XML:
http://tools.jb51.net/code/xmlformat

XML線上壓縮/格式化工具:
http://tools.jb51.net/code/xml_format_compress

XML程式碼線上格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat

更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python操作xml資料技巧總結》、《Python資料結構與演算法教程》、《Python Socket程式設計技巧總結》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python入門與進階經典教程》及《Python檔案與目錄操作技巧彙總

希望本文所述對大家Python程式設計有所幫助。

您可能感興趣的文章:

python處理json資料中的中文在Python中利用Pandas庫處理大資料的簡單介紹python處理csv資料的方法python處理二進位制資料的方法從零學python系列之資料處理程式設計例項(二)從零學python系列之資料處理程式設計例項(一)python資料預處理之將類別資料轉換為數值的方法python資料清洗系列之字串處理詳解python資料處理實戰(必看篇)利用python如何處理百萬條資料(適用java新手)

相關文章

程式語言 最新文章