python xml

xml作为数据存储的一种格式,有着较大使用意义。

1、读取xml

def xml():

    tree = ET.parse(datarxml)
    root = tree.getroot()    #r解析整个xml
    size = root.find('size')  #root同层
    w = int(size.find('width').text)#root同层
    h = int(size.find('height').text)#root同层
    bboxes = []
    labels = []
    bboxes_ignore = []
    labels_ignore = []
    for obj in root.findall('object'):#root同层
        name = obj.find('name').text  #root子层进行处理。
        difficult = int(obj.find('difficult').text)
        bnd_box = obj.find('bndbox')
        bbox = [
            int(bnd_box.find('xmin').text),
            int(bnd_box.find('ymin').text),
            int(bnd_box.find('xmax').text),
            int(bnd_box.find('ymax').text)
        ]
        if difficult:
            bboxes_ignore.append(bbox)
            # labels_ignore.append(label)
        else:
            bboxes.append(bbox)
            # labels.append(label)

    print("bboxes",bboxes)
    

2、保存xml

from xml.sax import *
from xml.dom.minidom import Document,parse
import xml.dom.minidom
import os
import datetime

class Movie(object):
    UNKNOWNYEAR = 1890
    UNKNOWNMINUTES = 0
    def __init__(self, title=None, year=UNKNOWNYEAR,
                 minutes=UNKNOWNMINUTES, acquired=None, notes=None):
        self.title = title
        self.year = year
        self.minutes = minutes
        self.acquired = (acquired if acquired is not None
                                  else datetime.date.today())
        self.notes = notes
class MovieContainer(object):

    def __init__(self,fname,movies):
        self.__fname = fname
        self.__movies = movies
    def exportXml(self, fname):
        try:
            doc = Document()
            movies = doc.createElement("MOVIES")
            movies.setAttribute("VERSION", "1.0")
            doc.appendChild(movies)
            movie=doc.createElement("MOVIE")
            movie.setAttribute("YEAR", str(self.__movies.year))
            movie.setAttribute("MINUTES", str(self.__movies.minutes))
            movie.setAttribute("ACQUIRED", str(self.__movies.acquired))
            movies.appendChild(movie)
            title=doc.createElement("TITLE")
            title_value = doc.createTextNode(str(self.__movies.title))
            title.appendChild(title_value)
            movie.appendChild(title)
            notes=doc.createElement("NOTES")
            notes_value = doc.createTextNode(str(self.__movies.notes))
            notes.appendChild(notes_value)
            movie.appendChild(notes)        
            # 将dom对象写入本地xml文件
            with open(fname, 'wb') as f:
                f.write(doc.toprettyxml(indent='\t', newl="\n",encoding='utf-8'))
        except Exception as e:
            error = "Failed to export: {0}".format(e)
            print(error)
        else:
            print("Exported 1 movie records to {0}".format(
                    os.path.basename(fname)))


    def importDOM(self, fname):
        try:
            # 使用minidom解析器打开 XML 文档
            DOMTree = xml.dom.minidom.parse(fname)
            movies = DOMTree.documentElement  
            # 在集合中获取所有电影
            movie_c = movies.getElementsByTagName("MOVIE")        
            for movie in movie_c:
                try:            
                    #print("*****Movie*****")
                    if movie.hasAttribute("YEAR"):
                        year=movie.getAttribute("YEAR")
                    if movie.hasAttribute("MINUTES"):
                        minutes=movie.getAttribute("MINUTES")
                    if movie.hasAttribute("ACQUIRED"):
                        ymd=movie.getAttribute("ACQUIRED").split("-")
                        if len(ymd) != 3:
                            raise ValueError("invalid acquired date {0}".format(
                                    str(movie.getAttribute("ACQUIRED"))))
                        acquired = datetime.date(int(ymd[0]), int(ymd[1]),
                                                int(ymd[2]))
                    title = notes = None
                    title_tag = movie.getElementsByTagName('TITLE')[0]
                    title=title_tag.childNodes[0].data  
                    notes_tag = movie.getElementsByTagName('NOTES')[0]
                    try:
                        notes=notes_tag.childNodes[0].data
                    except Exception:
                        raise ValueError("missing title or notes")
                except ValueError as e:
                    print("Failed to import: {0}".format(e))
                print(title,year,minutes,acquired,notes)
        except Exception as e:
            print(e)


    def importSAX_standard(self, fname):
        #try:
            # 创建一个 XMLReader
            parser = xml.sax.make_parser()
            # turn off namepsaces
            parser.setFeature(xml.sax.handler.feature_namespaces, 0)        
            # 重写 ContextHandler
            Handler = MovieHandler(self.__movies)
            parser.setContentHandler(Handler)                 
            parser.parse(fname)
            print("Imported 1 movie records from {0}".format(
                    os.path.basename(fname)))        
        #except Exception as e:
            #print(e)


class MovieHandler(ContentHandler):

    def __init__(self, movies):
        super(ContentHandler, self).__init__()
        self.CurrentData = ""
        self.movies = movies
        self.text = ""
        self.error = None


    def clear(self):
        self.year = None
        self.minutes = None
        self.acquired = None
        self.title = None
        self.notes = None


    def startElement(self, tag, attributes):
        #self.CurrentData = tag
        if tag == "MOVIE":
            self.clear()
            self.year = int(attributes["YEAR"])
            self.minutes = int(attributes["MINUTES"])
            ymd = attributes["ACQUIRED"].split("-")
            if len(ymd) != 3:
                raise ValueError("invalid acquired date {0}".format(
                        str(attributes["ACQUIRED"])))
            self.acquired = datetime.date(int(ymd[0]),
                    int(ymd[1]), int(ymd[2]))
        elif tag in ("TITLE", "NOTES"):
            self.text = ""
        return True


    def characters(self, text):
        self.text += text
        return True


    def endElement(self, tag):
        if tag == "MOVIE":
            if (self.year is None or self.minutes is None or
                self.acquired is None or self.title is None or
                self.notes is None or not self.title):
                raise ValueError("incomplete movie record")
            print(self.title, self.year,
                    self.minutes, self.acquired,self.notes)

        elif tag == "TITLE":
            self.title = self.text.strip()
        elif tag == "NOTES":
            self.notes = self.text.strip()
        return True


if __name__ == "__main__":

    textdata=[["God save world",1989,45,None,"HELLO WORLD"]]
    fname="/home/yrd/work/movietest.xml"
    for data in textdata:
        movie=Movie(data[0],data[1],data[2],data[3],data[4])
        moviecontainer=MovieContainer(fname, movie)
        print("#exportDOM")
        moviecontainer.exportXml(fname)
        print("#importDOM")
        moviecontainer.importDOM(fname)
        print("#importSAX")
        moviecontainer.importSAX_standard(fname)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的xml模块提供了处理XML文件的功能。可以使用xml.etree.ElementTree模块来创建、解析和操作XML文档。 示例代码\[1\]展示了如何使用ElementTree模块创建一个XML文档,并将其写入到名为"1.xml"的文件中。首先,创建一个根元素"Root",然后创建三个子元素"name"、"age"和"gender",并将它们添加到根元素中。最后,使用ElementTree的write方法将XML文档写入文件。 示例代码\[2\]展示了如何使用ElementTree模块对XML文档进行格式化输出。通过定义一个辅助函数__indent,可以在写入XML文档之前对元素进行缩进处理,使其更易读。 示例代码\[3\]展示了如何使用ElementTree模块解析XML文档。首先,使用ElementTree的parse方法读取名为"1.xml"的文件,并获取根元素。然后,可以遍历根元素的子元素,并打印出它们的标签、文本和属性。最后,可以使用子元素的set方法添加属性,并使用ElementTree的write方法将修改后的XML文档写入到名为"2.xml"的文件中。 总结来说,Pythonxml模块提供了创建、解析和操作XML文档的功能,可以方便地进行XML文件的处理。 #### 引用[.reference_title] - *1* *2* *3* [python读写xml文件](https://blog.csdn.net/qq_40006760/article/details/119251626)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值