• xml中俩种解析方式


    两种解析方式

    1、from xml.etree import ElementTree as ET

     利用ElementTree模块下的xml方法可以把一个字符串类型的东西转换成Element类,从而利用Element类下面的方法

    xml(字符串)解析方式只能读不能写

    from xml.etree import ElementTree as ET
    
    
    # 打开文件,读取XML内容
    str_xml = open('xo.xml', 'r').read()
    
    # 将字符串解析成xml特殊对象,root代指xml文件的根节点
    root = ET.XML(str_xml)
    
    from xml.etree import ElementTree as ET
    a=open("first_xml","r",encoding="utf-8").read()
    print(type(a))
    b=ET.XML(a)                  其中b为根节点                                #利用xml方法可以的到一个Element类
    print(type(b))

    <class 'str'>                    输入一个字符串类型的转成Element类
    <class 'xml.etree.ElementTree.Element'>
    def XML(text, parser=None):
        """Parse XML document from string constant.
    
        This function can be used to embed "XML Literals" in Python code.
    
        *text* is a string containing XML data, *parser* is an
        optional parser instance, defaulting to the standard XMLParser.
    
        Returns an Element instance.
    

     Element下面的方法:

    1、  iter所查看的东西)返回所匹配到的元素的迭代器     用于找到某一类节点并去循环

      Return an iterator containing all the matching elements.

    2、   tag  返回节点的标签名

    3、   attrib 返回标签的属性

    4、  find()找到第一个匹配到的对象并返回   只能找儿子不能找孙子

    5、    txet 获取标签的内容

    2、parse(文件名)打开文件并解析,相比于xml少了打开文件那一步

    from xml.etree import ElementTree as ET
    
    # 直接解析xml文件
    tree = ET.parse("xo.xml")
    
    # 获取xml文件的根节点
    root = tree.getroot()      通过getroot获取根节点
    
    from xml.etree import ElementTree as ET
    a=ET.parse("first_xml")          #解析成ElementTree类的对象
    b=a.getroot()                #转换成Element类的对象 print(a.getroot(),type(a)) <Element 'data' at 0x00000033D062F958> <class 'xml.etree.ElementTree.ElementTree'>
    def parse(source, parser=None):
        """Parse XML document into element tree.
    
        *source* is a filename or file object containing XML data,
        *parser* is an optional parser instance defaulting to XMLParser.
    
        Return an ElementTree instance.
    
        """
        tree = ElementTree()
        tree.parse(source, parser)
        return tree
    

     ElementTree下面的方法:

    1、  getroot()     获取xml文件的根节点    与xml不同(通过xml()直接获取根节点,而parse()还的再通过getroot获取根节点)

    2、  根节点.tag       获取节点的标签(这里与xml不同的是先利用getroot()得到根节点再tag)

    3、  根节点.attrib    获取节点的属性(原理同上)

    4、  text               获取标签的内容

    5、  a.write(文件名)写入文件

    from xml.etree import ElementTree as ET
    a=ET.parse("first_xml")
    b=a.getroot()
    for i in b.iter("year"):
        new_year=int(i.text)+1
        i.text=str(new_year)
    a.write("first_xml")
    

     6、  标签名.set("k1","k2")    为标签添加属性

    7、  del 标签名 attrib["k1"]  删除标签的属性,如果标签名无属性,删除报错

    3、创建一个XML文档

    方法1

    from xml.etree import ElementTree as ET
    a=ET.Element("aaa")                 #创建根节点
    b=ET.Element("bbb",{"k1":"k2"})    #创建子节点
    c=ET.Element("ccc",{"k2":"k3"})
    d=ET.Element("ddd",{"k3":"k4"})
    
    a.append(b)
    b.append(c)
    c.append(d)
      #生成文档对象 et = ET.ElementTree(a) *******#生成文档对象******** et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)

     方法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 = root.makeelement('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(son1)
      #生成文档对象
    tree = ET.ElementTree(root)
    tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
    

     方法3

    from xml.etree import ElementTree as f
    # 创建根节点 a=f.Element("QWE")
    # 创建儿子 b=f.SubElement(a,"asd",{"k1":"v1"})
    # 创建孙子 c=f.SubElement(b,"fgh",{"k2":"v2"})
      #生成文档对象 z=f.ElementTree(a) z.write("ad.xml",encoding="utf-8")

     控制节点自闭合

    short_empty_elements=False

    加上节点不能自闭合    <grandson name="儿12"></grandson>

    不加自闭合               <grandson name="儿12" />

    注释

    xml_declaration=True

    加上使xml文件有注释  <?xml version='1.0' encoding='utf-8'?>

    由于原生保存的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="	")
    
    # 创建根节点
    root = ET.Element("famliy")
    
    
    # 创建大儿子
    # son1 = ET.Element('son', {'name': '儿1'})
    son1 = root.makeelement('son', {'name': '儿1'})
    # 创建小儿子
    # son2 = ET.Element('son', {"name": '儿2'})
    son2 = root.makeelement('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(son1)
    
    
    raw_str = prettify(root)
    
    f = open("xxxoo.xml",'w',encoding='utf-8')
    f.write(raw_str)
    f.close()
    

     自己写的

    from xml.etree import ElementTree as f
    from xml.dom import minidom
    def prettify(elem):
        """将节点转换成字符串,并添加缩进。
        """
        rough_string = f.tostring(elem, 'utf-8')
        reparsed = minidom.parseString(rough_string)
        return reparsed.toprettyxml(indent="	")
    a=f.Element("QWE")
    b=a.makeelement("asd",{"K1":"V2"})
    c=a.makeelement("zxc",{"K1":"V2"})
    a.set("name","lu")
    a.append(b)
    b.append(c)
    z=prettify(a)       #转成字符串了直接写入
    s=open("xxxx.xml","w")
    s.write(z)
    s.close()
    
  • 相关阅读:
    c++智能指针的一些文章
    c++ template(8)模版多态
    空指针赋值分区
    windbg调试命令
    c++ template(5)模板实战
    GetStockObject 理解
    c++ template(6)模板术语
    c++ template(71)模板参数声明
    DirectDraw教程资料
    c++ template(9)trait和Policy
  • 原文地址:https://www.cnblogs.com/luxiaojun/p/5528966.html
Copyright © 2020-2023  润新知