XML 模块

XML 模块

XML
XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下:

<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2023</year>
        <gdppc>141100</gdppc>
        <neighbor direction="E" name="Austria" />
        <neighbor direction="W" name="Switzerland" />
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2026</year>
        <gdppc>59900</gdppc>
        <neighbor direction="N" name="Malaysia" />
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2026</year>
        <gdppc>13600</gdppc>
        <neighbor direction="W" name="Costa Rica" />
        <neighbor direction="E" name="Colombia" />
    </country>
</data>
View Code

1)、解析XML

@1.利用ElementTree.XML 将字符串解析成xml对象

    from xml.etree import ElementTree as ET  
    #打开文件,读取XML内容  
    str_xml = open('xo.xml','r').read() #打开xo.xml文件给读的权限,并读取  
    #将字符串解析成xml特殊对象,root代指xml文件的根节点  
    root =  ET.XML(str_xml)  

@2.利用ElementTree。parse将文件直接解析成xml对象

    from xml.etree import ElementTree as ET  
    #直接解析xml文件  
    tree = ET.parse("xo.xml"#获取xml文件的根节点  
    root = tree.getroot()  

2)、操作XML

XML 格式类型是节点嵌套节点,对于每一个阶段均有以下功能,以便对当前结点进行操作:

    class Element:  
        当前结点的标签名:  
        tag = None  
        当前结点的属性  
        attrib = None  
        当前结点的内容  
        text = None  
        def __init__(self, tag, attrib={}, **extra):  
            if not isinstance(attrib, dict):  
                raise TypeError("attrib must be dict, not %s" % (  
                    attrib.__class__.__name__,))  
            attrib = attrib.copy()  
            attrib.update(extra)  
            self.tag = tag  
            self.attrib = attrib  
            self._children = []  
        def makeelement(self, tag, attrib):  
            创建一个新节点  
            return self.__class__(tag, attrib)  
        def copy(self):  
            .....  
        def append(self,subelement):  
            为当前节点追加一个子节点  
        def extend(self, elements):  
            为当前子节点扩展n个子节点  
        def insert(self, index, subelement):  
            在当前节点的子节点中插入某个节点,即为当前节点创建子节点,然后插入指定位置  
        def remove(self, subelement):  
            在当前节点在子节点中删除某个节点  
        def find(self, path, namespaces=None):  
            获取第一个寻找到的子节点  
        def findtext(self, path, default=None, namespaces=None):  
            获取第一个寻找到的子节点的内容  
        def findall(self, path, namespaces=None):  
            获取所有的子节点  
        def iterfind(self, path, namespaces=None):  
            获取所有指定的节点,并创建一个迭代器(可以被for循环)  
        def clear(self):  
            清空节点  
        def get(self):  
            获取当前节点的属性值  
        def set(self, key, value):  
            为当前节点设置属性值  
        def keys(sekf):  
            获取当前节点的所有属性的key  
        def items(self):  
            获取当前节点的所有属性值,每个属性值都是一个键值对  
        def iter(self, tag=None):  
            在当前节点的子孙中根据节点名称寻找所以指定的节点,并返回一个迭代器(可以被for循环)  
        def getiterator(self, tag=None):  
            .....  
        def itertext(self):  
            在当前节点的子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器(可以被for循环)  

 进行实例操作:

a、遍历XML文档的所有内容

    for xml.etree import ElementTree as ET  
    *********解析方式一 ************  
    """ 
    #打开文件,读取XML内容 
    str_xml = open('xo.xml','r').read() 
    #将字符串解析成xml特殊对象,root代指xml文件的根节点 
    root = ET.XML(str_xml) 
     
    """  
    由于这样太繁琐,而python有更加简洁的方式  
      
    *******解析方式二***************  
    tree = ET.parse("xo.xml")   #直接解析xml文件  
    root = tree.getroot()   #获取xml文件的根节点  
    ###操作  
    print(root.tag)  #顶层标签  
      
    for child in root:#遍历XML文档的第二层  
        print(child.tag, child.attrib)#第二层节点的标签名称和标签属性  
        for i in child:  # 第二层节点的标签名称和内容  
            print(i.tag, i.text)  
View Code

b)、遍历XML中指定的节点

    from xml.etree import ElementTree as ET  
    ***********解析方式一**********  
    """ 
    str_xml = open("xo.xml","r").read() #打开文件读取xml内容 
    root = ET.XML(str_xml) #将字符串解析成xml特殊对象,root代指xml文件的根节点 
     
    """  
    ************解析方式二************  
      
    tree = ET.parse("xo.xml")   #直接解析xml文件  
    root = tree.getroot()  #获取xml文件的根节点  
    ###操作  
      
    print(root.tag)  #顶层标签  
    for node in root.iter('year'): #遍历XML中所有的year节点  
        print(node.tag, node.text)  #节点的标签名称和内容  
View Code

c)、修改节点内容
由于修改的节点时,均是在内存中进行,其不会影响文件中的内容。所以,如果想要修改,则需要重新将内存中的内容写到文件。

    @1、解析字符串方式,修改,保存  
        from xml.etree import ElementTree as ET  
        *******解析方式一*********  
        懒的写第一种方式了,困了***针对字符串(需要加上倒数第二句话)  
        ********解析方式二*******针对文件  
        tree = ET.parse("xo.xml")  
        root = tree.getroot()  
        print(root.tag)  #打印顶级标签  
        for node in root.iter('year'):  #循环所有year节点  
            new_year = int(node.text) + 1 将year节点中 的内容自增1  
            node.text = str(new_year)  
            #设置属性  
            node.set('name','alex')  
            node.set('age','18')  
      
            del node.attrib['name']  #删除属性  
        ********记得保存文件**********  
        tree = ET.ElementTree(root)  #这一句适用于第一种解析方式,因为他的格式是字符串,而第二种方式是ElementTree,所以不在需要转换了,程度:******  
        tree.write("newnew.xml", encoding="utf-8")  
View Code

d)、删除节点

    from xml.etree import ElementTree as ET  
    **********解析字符串方式打开********  
    #打开文件,读取XML内容  
    str_xml = open('xo.xml','r').read()  
    #将字符串解析成xml特殊对象,root代指xml文件的根节点  
    root = ET.XML(str_xml)  
    **********解析文件方式打开**********  
    tree = ET.parse('xo.xml')  #直接解析xml文件  
    root = tree.getroot()   #获取解析xml文件  
      
    *********操作*****************  
    print(root.tar) #打印顶级标签  
    for cuntry in root.findall('country'): #遍历data下的所有country节点  
        rank = int(country.find('rank').txt) #获取每一个country节点下rank节点的内容  
        if rank > 50:  
            root.remove(country)  
      
    *********保存文件***********  
    tree = ET.ElementTree(root) --如果是对字符串操作,就写这句,文件不用  
    tree.write("newnew.xml", encoding="utf-8")  
View Code

3、创建XML文档

@1)方法一: 

from xml.etree import ElementTree as ET  
root = ET.Element("famliy")  #创建根节点  
son1 = ET.Element('son',{"name":'儿1'}) #创建节点大儿子  
son2 = ET.Element('son', {"name":'儿2'})  #创建小儿子  
  
在大儿子中创建两个孙子  
grandson1 = ET.Element('grandson', {'name':"儿11"})  
grandson2 = ET.Element('grandson', {'name': '儿12'})  
son1.append(grandson1)  
son1.append(grandson2)  #把两个孙子添加到大儿子中  
  
#把大儿子添加到根节点中  
root.append(son1)  
root.append(son2)  
  
tree = ET.ElementTree(root)  
tree.write('oooo.xml', encoding='utf-8', short_empty_elements=False)  
View Code

@2)、方法二:        

    from xml.etree import ElementTree as ET  
    root = ET.element("famliy")  
      
    创建大儿子节点  
    #son1 = ET.Element('son', {"name":"儿1"})  
    son1 = root.makeelement("son", {"name":"儿1"})  
    #创建小儿子节点  
    #son2 = ET.Element('son', {"name":"儿2"})  
    son2 = ET.makeement('son', {"name":"儿2"})  
      
    #在大儿子中创建两个小儿子  
    #grandson1 = ET.Element('grandson', {'name':'儿11'})  
    grandson1 = son1.makeelement('grandson', {'name':'儿11'})  
    #grandson2 = ET.Element('grandson', {"name":"儿12"})  
    grandson2 = son1.makeelement("grandson", {"name":'儿12'})  
      
    son1.append(grandson1)  
    son1.append(grandson2)  
      
    把儿子添加到根节点中  
    root.append(son1)  
    root.append(son2)  
    tree = ET.ElementTree(root)  
    tree.write('oooo.xml', encoding="utf-8", short_empty_element=False)  
View Code

@3)、方法三:  

    from xml.etree import ElementTree as ET  
      
    root = ET.Element("famliy")  #创建根节点  
    创建节点大小儿子  
    son1 = ET.SubElement(root, "son", attrib={"name":"儿1"})  
    son2 = ET.SubElement(root, "son", attrib={"name":"儿2"})  
    创建大孙子  
    grandson1 = ET.SubElement(son1, "age", attrib={"name":"儿11"})  
    grandson1.text = '孙子'  
      
    et = ET.ElementTree(root)  #生成文档对象  
    et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)  
View Code

@4)、方法4:  

    由于原生保存的XML时默认无缩进,如果想要设置缩进的话,需要修改保存方式:  
    from xml.etree import ElementTree as ET  
    from xml.dom import minidom  #效率低功能少但是有排序功能  
      
      
    def prettify(elem):  
        """将节点转换成字符串,并添加缩进。 
        """  
        rough_string = ET.tostring(elem, 'utf-8')  #转换成字符串  
        reparsed = minidom.parseString(rough_string)  #缩进完再给我  
        return reparsed.toprettyxml(indent="\t")  返回值  
      
    root = ET.Element("famliy")  #创建根节点  
    创建节点大小儿子  
    son1 = ET.SubElement(root, "son", attrib={"name":"儿1"})  
    son2 = ET.SubElement(root, "son", attrib={"name":"儿2"})  
    创建大孙子  
    grandson1 = ET.SubElement(son1, "age", attrib={"name":"儿11"})  
    grandson1.text = '孙子'  
      
    raw_str = prettify(root)  
    f = open("xxoo.xml", "w", encoding="utf-8")  
    f.write(raw_str)  
    f.close()  
View Code

@5)、命名空间

网址:http://www.w3school.com.cn/xml/xml_namespaces.asp

    from xml.etree import ElementTree as ET  
      
    ET.register_namespace('com',"http://www.company.com") #some name  
      
    # build a tree structure  
    root = ET.Element("{http://www.company.com}STUFF")  
    body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": "123"})  
    body.text = "STUFF EVERYWHERE!"  
      
    # wrap it in an ElementTree instance, and save as XML  
    tree = ET.ElementTree(root)  
      
    tree.write("page.xml",  
               xml_declaration=True,  
               encoding='utf-8',  
               method="xml")  
View Code

 

posted @ 2016-07-05 14:23  我当道士那儿些年  阅读(271)  评论(0编辑  收藏  举报