今天来写一写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])
他的具体做法就是
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)
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,那我就是程序员,总会想尽一切办法,去读懂你.再见.