第十四课哟(主要来说说XML)

今天来写一写XML文件
XML是什么呢?(鬼使神差的就问了━━( ̄ー ̄*|||━━)是可扩展标记语言,与操作系统,编程语言的开发平台无关,实现不同系统之间的数据交换.他作用就是数据交换和配置应用程序和网站.
XML的结构
<?xml version="1.0" encoding="UTF-8" ?>
   此处问开头声明
<jiedianyi  name="aaa">  节点一开始
    <jiedianer>    节点二开始
        <fenjiedianyi>    分节点一</fenjiedianyi>
        <fenjiedianer>   
分节点二</fenjiedianer>
        <fenjiediansan> 
分节点三</fenjiediansan>
    </jiedianer> 
  节点二结束
</jiedianyi> 节点一的结束
在XML里的所有元素都称之为标签
<元素名 属性名="属性值">元素内容</元素名>     属性值由""包裹,一个元素可以有多个属性,属性之中不能直接包含特殊符号
在XML里元素名没有限制

在编写XML时的注意事项
1.所有的XML元素都必须由结束标签
2.XML标签对大小写敏感
3.XML必须正确的嵌套
4.同级元素标签以缩进对齐
5.元素名称可以包含字母,数字或者其他字符,但是,不能以数字或者标点符号开始
6.元素名称种不能含空格

XML文件格式
tag
,即标签,用于标识该元素表示哪种数据.
attrib,即属性,用Dictionary形式保存.
text,文本字符串,可以用来存储一些数据.
tail,尾字符串,并不是必须的.
<tag attrib>text<tag>tail
ElementTree解析XML文件

导入ElementTree==>import xml.etree.ElementTree as ET
解析Xml文件找到根节点:
直接解析XML文件并获得根节点==>tree = ET.parse('country_data.xml') root = tree.getroot()
解析字符串==>root = ET.fromstring(country_data_as_string)
遍历根节点可以获得子节点,然后就可以根据需求拿到需要的字段

1 先加载文档到内存里  形成一个倒装的树结构
 tree=ET.parse('XML.xml')
 2 获取根节点
 root=tree.getroot()
 hhh={}

 node=root.find('country')
 print(node.attrib['name'])

 print('tag:',root.tag,'attrib:',root.attrib,'text:',root.text)
 for ele in root:
     print('tag:', ele.tag, 'attrib:', ele.attrib)
     value=[]
     for e in ele:
             print('tag:', e.tag, 'attrib:', e.attrib, 'text:', e.text)
     if e.text is None:
             value.append(e.attrib)
     else:

             value.append({e.tag:e.text})
     hhh[ele.attrib['name']]=value

 print(hhh)

 node=root.find('country')
 print(node.attrib['name'])

删除指定的节点以及保存


import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
animNode = root.find('country')
if animNode.attrib['name'] == 'Liechtenstein':
     root.remove(animNode)
tree.write('finish.xml')
    
保存修改后的XML文件

使用SAX APL解析XML(这里是重中之重!)

make_parser()方法
以下方法创建一个新的解析器对象并返回它。创建的解析器对象将是系统查找的第一个解析器类型。
xml.sax.make_parser( [parser_list] )

parse()方法

以下方法创建一个SAX解析器并使用它来解析文档。
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
parseString方法
还有一种方法来创建SAX解析器并解析指定的XML字符串。
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

他的具体做法就是

import xml.sax
class MoveHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.CurrentData=""
        self.type=""
        self.format=""
        self.year=""
        self.rating=""
        self.stars=""
        self.description=""
    def startElement(self, tag, attrs):
        self.CurrentData=tag
        if tag=="movie":
            print("******movie******")
            title=attrs['title']
            print('title:',title)
    def characters(self, content):
        if self.CurrentData == "type":
            self.type = content
        elif self.CurrentData == "format":
            self.format = content
        elif self.CurrentData == "year":
            self.year = content
        elif self.CurrentData == "rating":
            self.rating = content
        elif self.CurrentData == "stars":
            self.stars = content
        elif self.CurrentData == "description":
            self.description = content
    def endElement(self, tag):
        if self.CurrentData == "type":
            print("type:", self.type)
        elif self.CurrentData == "format":
            print("format:", self.format)
        elif self.CurrentData == "year":
            print("year:", self.year)
        elif self.CurrentData == "rating":
            print("rating:", self.rating)
        elif self.CurrentData == "stars":
            print("stars:", self.stars)
        elif self.CurrentData == "description":
            print("description:", self.description)
        清空缓冲区  比较重要
        self.CurrentData = ""
if __name__=='__main__':
    1 create an XMLReader
    parser=xml.sax.make_parser()
    2 turn off namepsaces  工作目录或者工作空间  命名空间
    parser.setFeature(xml.sax.handler.feature_namespaces, 0)
    3 override the default ContextHandler
    handler=MoveHandler()
    替换覆盖原来的hadler
    parser.setContentHandler(handler)
    parser.parse("move.xml")

以上的move.xml是我的xml文件名称

写到这里,今天的XML就说完了,事实上这里的难点就是使用SAX APL解析XML,所以如果你再看这篇文章,一定要反复的去尝试,因为我再写的时候经常日常报错(lll¬ω¬)......

等等!我还有一句话:

                            如果你是XML,那我就是程序员,总会想尽一切办法,去读懂你.再见.


猜你喜欢

转载自blog.csdn.net/why861095769/article/details/80494737