日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

xml python gb2312_使用Python处理XML格式数据的方法介绍

發布時間:2024/10/14 python 78 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xml python gb2312_使用Python处理XML格式数据的方法介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文實例講述了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 = '[^>]+>'

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()

總結

以上是生活随笔為你收集整理的xml python gb2312_使用Python处理XML格式数据的方法介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。