xml模块
Posted dongzhihaoya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xml模块相关的知识,希望对你有一定的参考价值。
1.什么是xml(可扩展标记语言)
是一种定义电子文档结构和描述的语言,可以用来标记数据、定义数据类型
用户可以对自己的标记语言进行定义和扩展,由W3C(万维网标准组织)推出,几乎所有的编程语言都支持该格式
标记翻译为标签,标签指的是某种特殊符号,简单的是XML就是用标签来定义文档结构
xml文档格式
<person name="jack">hello i am a person</person> 一个完整的标签分为三个部分 标签名(tagname): person 属性(attribute): name(值为jack) 文本(text): hello i am a person
其中属性和文本都是可选的,所以可以定义一个空标签
<person></person>
格式:
一、任何的起始标签都必须有一个结束标签。
二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如。XML解析器会将其翻译成。
三、标签必须按顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
四、所有的属性都必须有值。
五、所有的特性都必须在值的周围加上双引号。
六、最外层必须有且只能有一个标签,称为根标签
2.与json对比
json是javascript语言的对象表示法,仅支持js中的数据类型,(虽然大多数情况下是足够使用的),之所以出现是因为在开发中,通常都需要后台像前台传输数据,所以传输前台能看懂的数据格式,json就是这样一种数据格式,可以轻松的被js语言解析,使用场景多为前后台交互
xml支持的数据类型理论上是不受限制的,因为可以完全自定义标签的结构和含义,使用场景也非常广泛,不局限于前后台的数据交互,在一些语言中还经常作为配置文件来使用。html也属于xml
3.使用xml模块解析
准备数据
<?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank updated="yes">2</rank> <year>2008</year> <gdppc>141100</gdppc> <neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank updated="yes">5</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank updated="yes">69</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> </data>
解析xml
import xml.etree.ElementTree as ET tree = ET.parse("xmltest.xml") root = tree.getroot() print(root.tag) #遍历xml文档 for child in root: print(‘========>‘,child.tag,child.attrib,child.attrib[‘name‘]) for i in child: print(i.tag,i.attrib,i.text) #只遍历year 节点 for node in root.iter(‘year‘): print(node.tag,node.text) #--------------------------------------- ? import xml.etree.ElementTree as ET tree = ET.parse("xmltest.xml") root = tree.getroot() #修改 for node in root.iter(‘year‘): new_year=int(node.text)+1 node.text=str(new_year) node.set(‘updated‘,‘yes‘) node.set(‘version‘,‘1.0‘) tree.write(‘test.xml‘) #删除node for country in root.findall(‘country‘): rank = int(country.find(‘rank‘).text) if rank > 50: root.remove(country) tree.write(‘output.xml‘)
1.三个用于查找标签函数 iter("标签名") #全文查找 find("标签名") #查找子节点匹配的第一个 findall("标签名") #查找字节点匹配的所有 2.访问标签的内容 element.tag 获取标签名 element.attrib 获取属性 element.text 获取文本 3.修改文档内容 elment.tag = "标签名" element.text = "文本" element.set("属性名","属性值") 4.删除节点 root.remove(标签对象) 5.添加子标签 #创建标签对象 year2=ET.Element(‘year2‘) # 指定名称 year2.text=‘新年‘ year2.attrib={‘update‘:‘yes‘} #添加 country.append(year2) #往country节点下添加子节点 删除添加修改后都需要调用write写入到文件 tree.write("文件名"),#注意文档对象才能执行写入操作
代码生成XML文档
import xml.etree.ElementTree as ET new_xml = ET.Element("namelist") name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"}) age = ET.SubElement(name,"age",attrib={"checked":"no"}) sex = ET.SubElement(name,"sex") sex.text = ‘man‘ name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"}) age = ET.SubElement(name2,"age") age.text = ‘19‘ et = ET.ElementTree(new_xml) #生成文档对象 et.write("test.xml", encoding="utf-8",xml_declaration=True) ET.dump(new_xml) #打印生成的格式
xml的解析比起json而言非常复杂 因为其扩展性远比json高,在java中常作为配置文件,当你在前后台进行数据交互时,优先是用json格式
疑惑:文本也可以作为属性,属性也可以作为文本,?到底如何选择?, XML不仅仅可以定义数据结构还可以定义数据的显示样式,想想HTML!
以上是关于xml模块的主要内容,如果未能解决你的问题,请参考以下文章
xml Eclipse模板(代码片段)检查参数并最终抛出IllegalArgumentException
从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration