最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
當前位置: 首頁 - 科技 - 知識百科 - 正文

使用Python處理XML格式數(shù)據(jù)的方法介紹

來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 14:25:07
文檔

使用Python處理XML格式數(shù)據(jù)的方法介紹

使用Python處理XML格式數(shù)據(jù)的方法介紹:本文實例講述了Python處理XML格式數(shù)據(jù)的方法。分享給大家供大家參考,具體如下:這里的操作是基于Python3平臺。在使用Python處理XML的問題上,首先遇到的是編碼問題。Python并不支持gb2312,所以面對encoding="gb2312"的XML文
推薦度:
導讀使用Python處理XML格式數(shù)據(jù)的方法介紹:本文實例講述了Python處理XML格式數(shù)據(jù)的方法。分享給大家供大家參考,具體如下:這里的操作是基于Python3平臺。在使用Python處理XML的問題上,首先遇到的是編碼問題。Python并不支持gb2312,所以面對encoding="gb2312"的XML文

本文實例講述了Python處理XML格式數(shù)據(jù)的方法。分享給大家供大家參考,具體如下:

這里的操作是基于Python3平臺。

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

Python并不支持gb2312,所以面對encoding="gb2312"的XML文件會出現(xiàn)錯誤。Python讀取的文件本身的編碼也可能導致拋出異常,這種情況下打開文件的時候就需要指定編碼。此外就是XML中節(jié)點所包含的中文。

我這里呢,處理就比較簡單了,只需要修改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函數(shù)可以使得該類可調用,比如下面代碼的最后幾行,在main函數(shù)中。這也很突出地體現(xiàn)了在Python的世界里,一切都是對象,包括對象本身 :)

一直覺得main函數(shù)用來測試真是蠻好用的。

#!/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)
 #在上述兩行代碼沒有出現(xiàn)異常的基礎上再創(chuàng)建節(jié)點
 #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()

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

使用Python處理XML格式數(shù)據(jù)的方法介紹

使用Python處理XML格式數(shù)據(jù)的方法介紹:本文實例講述了Python處理XML格式數(shù)據(jù)的方法。分享給大家供大家參考,具體如下:這里的操作是基于Python3平臺。在使用Python處理XML的問題上,首先遇到的是編碼問題。Python并不支持gb2312,所以面對encoding="gb2312"的XML文
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top