Python XML 형식 데이터 처리 방법 상세 설명

7633 단어 PythonXML
이 글 의 실례 는 Python 이 XML 형식 데 이 터 를 처리 하 는 방법 을 설명 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
이곳 의 조작 은 Python 3 플랫폼 을 바탕 으로 합 니 다.
Python 을 사용 하여 XML 을 처리 하 는 문제 에서 가장 먼저 발생 하 는 것 은 인 코딩 문제 이다.
Python 은 gb 2312 를 지원 하지 않 기 때문에 encoding="gb 2312"의 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.Element Tree 를 사용 하여 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 의 Unbound LocalError 오류 가 재 미 있 었 습 니 다.기호 표 의 덮어 쓰기 문제 인지 아 닌 지 모 르 겠 습 니 다.

#!/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 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기