• 105.格式化文件xml与json


    结构化文件存储

    xml

    • 可扩展的标记语言(eXtensible Markup Language),是w3c组织指定的标准,比html更简单一些
    • 标记语言:语言中使用<>括取来的文本字符串作为标记
    • 可扩展:用户可以自己定义需要的标记,html不行

    xml文档的构成

    • 处理指令(可以认为一个文件内只有一个处理指令)
      • 最多只有一行
      • 必须在第一行
      • 与xml本身处理相关的一些生命和指令
        • 以?xml开头
        • 一般用于声明xml的版本和采用的编码
        • version属性是必须的
        • encoding属性用来指出xml解释器使用的编码
    • 根元素(一个文件内只有一个根元素)
      -在xml文件中,可以把他看做是一个树形结构
      • 有切只能有一个
    • 子元素
      -根元素下所有的元素,都是子元素
    • 属性
      • 提供有关元素的额外信息
      • 通常提供不属于数据组成部分的信息
      • 值必须使用引号,单引号双引号都行,内容中有单引号,就使用双引号,反之亦然
    • 内容
    • 注释
      • 其说明左右的信息
      • 注释不能在标签内
      • 注释内不可以有一个以上的短横线
      • 保留字符
    <?xml version="1.0" encoding="utf-8"?>
    <note>
    
        <xsq>
        <name>显示器</name>
        <date>2018/01/01</date>
        </xsq>
    
        <sb>
        <name>鼠标</name>
        <date>2019/01/01</date>
        </sb>
    
        <jp>
        <name>键盘</name>
        <date>2020/01/01</date>
        </jp>
    
    </note>
    

    xml访问

    读取

    • 分为两个主要技术 SAX 和 DOM
    • SAX
      • 基于事件驱动
      • 用SAX解析文档涉及到解析器和事件处理器
      • 特点:
        • 流式读取
    • DOM
      • 是W3C规定的XML编程接口,推荐

      • 读取一个xml文件,以属性结构保存到缓存中

      • 用途

        • 定位浏览xml任何一个节点的信息
        • 添加删除相应的内容
      • minidom和etree

        • minidom
          • minidom.parse(filename):加载读取的xml文件,也可以是xml代码
          • .documentElement:获取xml文档对象,一个xml文件只有一个对应的文档对象
          • .getAttribute(attr_name):获取xml节点属性 attr_name属性名
          • .getElementByTagName(tage_name):得到一个节点对象的集合 tage_name节点名
          • .childNodes:得到所有子节点的列表
          • .childNodes[index].nodeValue:获得单个节点的值
          • .firstNode:获得第一个节点,等价于.childNodes[0]
          • .attributes[tage_name]
        import xml.dom.minidom
        from xml.dom.minidom import parse
        #读取文件形成树文件
        DOMtree = xml.dom.minidom.parse("./t.xml")
        #通过树文件,实例根节点
        doc = DOMtree.documentElement
        
        print(list(doc.childNodes))
        #遍历根节点的子节点
        for i in doc.childNodes:
            #便利子节点的子节点
            for n in i.childNodes:
                if n.nodeName == "name":
                    print(n.childNodes[0].data)
                if n.nodeName == "date":
                    print(n.childNodes[0].data)
        
        • etree
          • .getiterator 得到相应可迭代的node集合
          • .lite 同上
          • .find(node_name) 查找置顶名字的节点。返回一个node
          • .findall(node_name) 返回多个node_name的节点
          • .tag 节点名
          • .text 节点文本
          • .attrib node属性的字典类型内容
        import xml.etree.ElementTree
        
        root = xml.etree.ElementTree.parse("./t.xml")
        
        #利用getiterator访问
        nodes = root.getiterator()
        for node in nodes:
            print("{0}--{1}".format(node.tag, node.text))
        
        print("-" * 30)
        #利用find和findall方法访问
        jpm = root.find("jp")
        print("{0}--{1}".format(jpm.tag, jpm.text))
        
        print("-" * 30)
        l = root.findall("jp")
        for i in l:
            print("{0}--{1}".format(i.tag, i.text))
            for n in i.iter():
                if n.tag == "name":
                    f "other" in n.attrib.keys():
                        print(n.attrib["other"])
        

    创建xml文件

    • 更改方式

      • ele.set:更改属性
      • ele.append:添加子元素
      • ele.remove:删除元素
    • 第一种方式

    import xml.etree.ElementTree as ET
    
    note = ET.Element("note")
    name = ET.Element("name", {"a":"A"})
    date = ET.Element("date", {"b":"B"})
    
    note.append(name)
    note.append(date)
    
    t = ET.ElementTree(note)
    t.write('family_tree.xml',
            encoding='utf-8', 
            short_empty_elements=False,
            xml_declaration=True)
    
    • 第二种方式
    import xml.etree.ElementTree as ET
    
    note = ET.Element("note")
    
    name = note.makeelement("name", {"a":"A"})
    date = note.makeelement("date", {"b":"B"})
    
    note.append(name)
    note.append(date)
    
    t = ET.ElementTree(note)
    t.write('family_tree.xml',
            encoding='utf-8', 
            short_empty_elements=False,
            xml_declaration=True)
    
    • 第三种方式
    import xml.etree.ElementTree as ET
    #创建根节点
    note = ET.Element("note")
    
    #给根节点添加子元素name
    name = ET.SubElement(note, "name")
    #添加属性
    name.attrib = {"w":"w", "h":"h"}
    #添加内容
    name.text = "abcd"
    
    #给根节点添加子元素date
    date = ET.SubElement(note, "date")
    date.text = "qwer"
    
    #创建树文件
    t = ET.ElementTree(note)
    #用树文件创建xml文件,并写入建好的结构
    t.write('family_tree.xml',
            encoding='utf-8', 
            short_empty_elements=False,
            xml_declaration=True)
    

    json

    • 轻量级的数据交换格式
    • 格式是一个键值对形式的数据集
      • key:必须是字符串
      • value:字符串,数字,列表,json(可以嵌套)
      • 使用大括号包裹

    json包

    • json和python相互转换
      • json.dumps():把python格式转化为json格式
      • json.loads():把json格式转化为python格式
    • python读取json文件
      • json.dump():把内容写入文件
      • json.load():把json文件读入python
    import json
    
    j = {"name":"a", "date":"b"}
    
    #把字典转化成json格式的字符串
    js = json.dumps(j)
    print(type(js))
    print(js)
    
    #把json格式字符串转化成python字典
    js = json.loads(js)
    print(type(js))
    print(js)
    
    import json
    
    j = {"name":"a", "date":"b"}
    
    #把python的字典,以json的格式写入文件
    with open("t.json", "w") as t:
            json.dump(j, t)
    
    #读取json文件,转化为python的字典形式
    with open("t.json", "r") as t:
            p = json.load(t)
    
    print(type(p))
    print(p)
    
  • 相关阅读:
    抽象工厂模式
    工厂方法模式
    简单工厂模式
    Zuul
    Turbine
    Hystrix
    Feign
    Ribbon
    Eureka
    @MappedSuperclass的作用
  • 原文地址:https://www.cnblogs.com/TK-tank/p/12322986.html
Copyright © 2020-2023  润新知