zoukankan      html  css  js  c++  java
  • 学习笔记-Python基础19-结构化文件存储-xml

    # 结构化文件存储
    - xml, json
    - 为了解决不同设备之间信息交流
    - xml
    - json
    # XML文件
    - XML(eXtensibleMarkupLanguage)可扩展的标记语言
    - 标记语言:语言中使用尖括号括起来的文本字符串标记
    - 可扩展:用户可以自己定义需要的标记
    - 例如:
    <Teacher>
    自定义标记Teacher
    在两个标记之间任何内容都该跟Teacher相关
    </Teacher>
    - 是w3c组织制定的一个标准
    - XML描述的是数据本身,即数据的结构和语义
    - HTML侧重于如何显示web页面中的数据
    - XML文档的构成
    - 处理指令(可以认为一个文件内只有一个处理指令)
    - 最多只有一行
    - 且必须在第一行
    - 内容是与xml本身处理相关的一些声明或者指定
    - 以xml开头
    - 一般用于声明xml的版本和采用的编码
    - version属性是必须的,表示版本
    - encoding属性用来说明xml解释器使用的编码
    - 根元素(一个文件内只有一个根元素)
    - 在整个xml文件中,可以把它看作一个树形结构
    - 根元素有且只能有一个
    - 子元素
    - 属性
    - 内容
    - 表明标签所存储的信息
    - 注释
    - 起说明作用的信息
    - 注释不能嵌套在标签里面
    - 只有在注释的开始和结尾使用双短横线
    - 三短横线只能出现在注释的开头而不能用在结尾,举例:
    <name> < !-- asd --> </name>
    < !--- my-name -->
    - 保留字符的处理
    - xml中使用的符号可能跟实际符号相冲突,典型的就是左右尖括号
    - 使用实体引用(EntityReference)来表示保留字符
    - <score> math/>80 </score> #有错
    - <score> math&gt;80 </score> #实体引用:&开始,gt需要的符号,;结束
    - 把含有保留字符的部分放在CDATA块内部,CDATA块把内部信息视为不需要转义
    <![CDATA[
    select name,age
    from Student
    where score>80
    ]]>
    'i love wangxiao'
    r'i love wangxiao' #保持原意读r
    - 常用的需要转义的保留字符和对应实体引用
    - &
    &amp;
    - <
    &lt;
    - >
    &gt;
    - '
    &apos;
    - "
    &quot;
    一共五个,每个实体引用都以&开头并且以分号结尾
    - XML标签的命名规则
    - Pascal命名法
    - 用单词表示,第一个字母大写
    - 大小写严格区分
    - 配对的标签必须一致
    - 命名空间
    - 为防止命名冲突
    <Student>
    <Name>liuda</Name>
    <Age>19</Age>
    </Student>
    <Room>
    <Name>2105</Name>
    <Location>1-23-1</Location>
    </Room>
    - 如果归并上述两个内容信息,会产生冲突
    <Schooler>
    <Name>liuda</Name>
    <Age>19</Age>
    <Name>2105</Name>
    <Location>1-23-1</Location>
    </Schooler>
    - 为避免冲突,需要给肯呢过冲突元素加上命名空间
    - xmlns: xml name space的缩写
    <Schooler xmlns:student="http://my_student" xmlns:room="my_room">
    <student.Name>liuda</student.Name>
    <Age>19</Age>
    <room.Name>2105</room.Name>
    <Location>1-23-1</Location>
    </Schooler>
    <?xml version="1.0" ?>
    <School type="online" loc="beijing">
        <Student type="Web" gender="male">
            <Name>haha</Name>
            <Age>18</Age>
            <Score> math&gt;80 </Score>
        </Student>
        <Student>
            <Name>hahaha</Name>
            <Age>18</Age>
        </Student>
    </School>
    - XML访问
    - 读取
    - XML读取分两个主要技术:SAX、DOM
    - SAX(Simple API for XML):
    - 基于事件驱动
    - 利用SAX解析文档到解析器和事件处理两部分
    - 特点:
    - 快
    - 流式读取
    - DOM
    - 是w3c规定的xml编程接口
    - 一个xml文件在缓存中以树形结构保存,读取
    - 用途:
    - 定位浏览xml任何一个节点信息
    - 添加删除相应内容
    - minidom
    - minidom.parse(filename):加载读取的xml文件,filename也可以是xml代码
    - doc.documentElement:获取xml文档对象,一个xml文件只有一个文档对象
    - node.getAttribute(attr_name):获取xml节点的属性值
    - node.getElementByTagName(tage_name):得到一个节点对象集合
    - node.childNodes;得到所有孩子节点
    - node.childNodes[index].nodeValue:获取单个节点值
    - node.firstNode:得到第一个节点,等价于node.childNodes[0]
    - node.attributes[tage_name]
           案例01.py

        - etree
        - 以树形结构来表示xml
        - root.getiterator:得到相应的可迭代的node集合
        - root.iter
        - find(node_name):查找指定node_name的节点,返回一个node
        - root.findall(node_name):返回多个node_name的节点
        - node.tag:node对应的tagename
        - node.text:node的文本值
        - node.attrib:是node的属性的字典类型的内容
        案例02.py

    - xml文件写入
    - 更改
    - ele.set:修改属性
    - ele.append:追加一个子元素
    - ele.remove:删除元素
    案例03.py

       
    
    
    - xml生成创建
    # 一、SubElement方式,会在当前目录生成1个Student1.xml文件
    import xml.etree.ElementTree as et
    
    stu = et.Element("Student1")
    
    name = et.SubElement(stu, 'Name')
    name.attrib = {'lang':'en'}
    name.text = 'maoye'
    
    age = et.SubElement(stu, 'Age')
    age.text = 18
    
    et.dump(stu)
    # 二、minidom方式,打开Manager.xml,把元素写入
    import xml.dom.minidom
    
    # 在内存中创建一个空的文档
    doc = xml.dom.minidom.Document()
    # 创建一个根节点Managers对象
    root = doc.creatElement('Managers')
    # 设置根节点的属性
    root.setAttribute('company','xx科技')
    root.setAttribute('address','科技园')
    # 将根节点添加到文档对象中
    doc.appendChild(root)
    managerList = [{'name':'joy1', 'age':18, 'sex':''},
                   {'name':'joy2', 'age':18, 'sex':''},
                   {'name':'joy3', 'age':18, 'sex':''}]
    for i in managerList:
        nodeManager = doc.createElement('Manager')
        nodeName = doc.createElement('name')
        nodeName.appendChild(doc.createTextNode(str(i['name'])))
        nodeAge = doc.createElement("age")
        nodeAge.appendChild(doc.createTextNode(str(i['age'])))
        nodeSex = doc.createElement("sex")
        nodeSex.appendChild(doc.createTextNode(str(i['sex'])))
    
        nodeManager.appendChild(nodeName)
        nodeManager.appendChild(nodeAge)
        nodeManager.appendChild(nodeSex)
        root.appendChild(nodeManager)
    fp = open('Manager.xml', 'w')
    doc.writexml(fp, indent='	', addindent='	', newl='
    ', encoding="utf-8")

      - xml生产创建的第三种方式:etree,案例06.py

      

    
    


  • 相关阅读:
    Windows PE导出表编程3(暴力覆盖导出函数)
    Windows PE导出表编程3(暴力覆盖导出函数)
    Windows PE导出表编程2(重组导出表函数地址)
    Windows PE导出表编程2(重组导出表函数地址)
    Windows核心编程 第二十章 DLL的高级操作技术
    Windows核心编程 第二十章 DLL的高级操作技术
    Windows核心编程 第十九章 DLL基础
    CodeForces A. Points in Segments
    PAT 甲级 1031 Hello World for U
    PAT L1-006 连续因子
  • 原文地址:https://www.cnblogs.com/Cloudloong/p/9810306.html
Copyright © 2011-2022 走看看