标准库系列之xml模块
Python标准库系列之xml模块
带分隔符的文件仅有两维的数据:行和列。如果你想在程序之间交换数据结构,需要一种方法把层次结构、序列、集合和其他的结构编码成文本。
<?xmlversion="1.0"encoding="utf-8"?> <feedxmlns="http://www.w3.org/2005/Atom"> <title>安生'sBlog</title> <subtitle>大好时光!</subtitle> <linkhref="/atom.xml"rel="self"/> <linkhref="https://blog.ansheng.me/"/> <updated>2016-05-24T15:29:19.000Z</updated> <id> <author> <name>安生</name> </author> </feed> XML的一些重要特性
XML通常用于数据传送和消息,它存在一些子格式,如RSS和Atom,例如:https://blog.ansheng.me/atom.xml 在Python中解析XML最简单的方法是使用
创建xml文件导入ElementTree方法,起一个别名为ET >>>fromxml.etreeimportElementTreeasET 创建顶级标签 >>>level_1=ET.Element("famliy") 创建二级标签,tag名name,attrib标签属性 >>>level_2=ET.SubElement(level_1,"name",attrib={"enrolled":"yes"}) 创建三级标签 >>>level_3=ET.SubElement(level_2,"age",attrib={"checked":"no"}) 生成文档 >>>tree=ET.ElementTree(level_1) 写入文件中 >>>tree.write('oooo.xml',encoding='utf-8',short_empty_elements=False) 导入os模块,用os模块中的system方法执行shell命令查看刚才创建的oooo.xml文件 >>>importos >>>os.system("catoooo.xml") #生成出来的文档是没有换行的 <famliy><nameenrolled="yes"><agechecked="no"></age></name></famliy>0 把刚才生成的文件下载到本地,然后用浏览器打开就可以看到分级层次了。 创建一个有换行的XML文件代码 fromxml.etreeimportElementTreeasET fromxml.domimportminidom root=ET.Element('level1',{"age":"1"}) son=ET.SubElement(root,"level2",{"age":"2"}) ET.SubElement(son,"level3",{"age":"3"}) #tree=ET.ElementTree(root) #tree.write("abc.xml",encoding="utf-8",xml_declaration=True,short_empty_elements=False) defprettify(root): rough_string=ET.tostring(root,'utf-8') reparsed=minidom.parseString(rough_string) returnreparsed.toprettyxml(indent="t") new_str=prettify(root) f=open("new_out.xml","w") f.write(new_str) f.close() 生成的xml文件 <?xmlversion="1.0"?> <level1age="1"> <level2age="2"> <level3age="3"/> </level2> </level1> 解析XML
<data> <countryname="Liechtenstein"> <rankupdated="yes">2</rank> <yearage="19">2025</year> <gdppc>141100</gdppc> <neighbordirection="E"name="Austria"/> <neighbordirection="W"name="Switzerland"/> </country> <countryname="Singapore"> <rankupdated="yes">5</rank> <yearage="19">2028</year> <gdppc>59900</gdppc> <neighbordirection="N"name="Malaysia"/> </country> <countryname="Panama"> <rankupdated="yes">69</rank> <yearage="19">2028</year> <gdppc>13600</gdppc> <neighbordirection="W"name="CostaRica"/> <neighbordirection="E"name="Colombia"/> </country> </data>
利用ElementTree.XML将字符串解析成xml对象 >>>fromxml.etreeimportElementTreeasET #打开文件,读取XML内容,将字符串解析成xml特殊对象,root代指xml文件的根节点 >>>root=ET.XML(open('first.xml','r').read()) >>>root.tag 'data' >>>fornodeinroot: ...print(node.tag,node.attrib) ... ('country',{'name':'Liechtenstein'}) ('country',{'name':'Singapore'}) ('country',{'name':'Panama'}) >>>print(node.find('rank').text) 69 利用ElementTree.parse将文件直接解析成xml对象 >>>fromxml.etreeimportElementTreeasET #直接解析xml文件 >>>tree=ET.parse("first.xml") #获取xml文件的根节点 >>>root=tree.getroot() >>>root.tag 'data' 遍历XML中指定的节点 >>>fromxml.etreeimportElementTreeasET >>>tree=ET.parse("first.xml") >>>root=tree.getroot() >>>fornodeinroot.iter('year'): #输出node的tag和内容 ...print(node.tag,node.text) ... year2025 year2028 year2028 增、删、改XML为节点添加属性 >>>fromxml.etreeimportElementTreeasET >>>tree=ET.parse("first.xml") >>>root=tree.getroot() >>>fornodeinroot.iter("year"): #查看原来的属性 ...print(node.attrib) ... {} {} {} >>>fornodeinroot.iter("year"): #添加属性 ...node.set("OS","Linux") ... >>>fornodeinroot.iter("year"): #查看添加的属性 ...print(node.attrib) ... {'OS':'Linux'} {'OS':'Linux'} {'OS':'Linux'} #把内容写入文件 >>>tree.write("first.xml") 删除节点属性 >>>fromxml.etreeimportElementTreeasET >>>tree=ET.parse("first.xml") >>>root=tree.getroot() >>>fornodeinroot.iter("year"): #删除节点的OS属性 ...delnode.attrib['OS'] ... #写入到文件当中 >>>tree.write("first.xml") 查看属性 >>>fromxml.etreeimportElementTreeasET >>>tree=ET.parse("first.xml") >>>root=tree.getroot() >>>fornodeinroot.iter("year"): ...print(node.attrib) ... #节点内容为空 {} {} {} 修改节点内容 修改 >>>fromxml.etreeimportElementTreeasET >>>tree=ET.parse("first.xml") >>>root=tree.getroot() >>>fornodeinroot.iter("year"): #输出原来year的内容 ...print(node.text) #原来的值自加+ ...new_year=int(node.text)+1 ...node.text=str(new_year) ... 2025 2028 2028 #写入文件中 >>>tree.write("first.xml") >>>fornodeinroot.iter("year"): #输出写入文件之后year的内容 ...print(node.text) ... 2026 2029 2029 对节点操作的方法获取节点的方法 >>>fromxml.etreeimportElementTreeasET >>>tree=ET.parse("first.xml") >>>root=tree.getroot() >>>print(dir(root)) ['__class__','__copy__','__deepcopy__','__delattr__','__delitem__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__getstate__','__gt__','__hash__','__init__','__le__','__len__','__lt__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__setitem__','__setstate__','__sizeof__','__str__','__subclasshook__','append','clear','extend','find','findall','findtext','get','getchildren','getiterator','insert','items','iter','iterfind','itertext','keys','makeelement','remove','set'] 方法有这么多,那么我们常用的也就是下面的几个
实例判断QQ是否在线 腾讯提供了能够查看QQ号码是否在线的API, >>>importrequests >>>fromxml.etreeimportElementTreeasET >>>r=requests.get("http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=6087414") >>>result=r.text >>>fromxml.etreeimportElementTreeasET >>>node=ET.XML(result) >>>ifnode.text=="Y": ...print("在线") ...else: ...print("离线") ... 在线 获取列车起止时间 代码 r=requests.get("http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=K234&UserID=") result=r.text root=ET.XML(result) fornodeinroot.iter('TrainDetailInfo'): print(node.find('TrainStation').text,node.find('ArriveTime').text,node.find("StartTime").text) 执行结果 C:Python35python.exeF:/Python_code/sublime/Week5/Day01/xml_mod.py 上海(车次:K234K235)None11:12:00 #地点停止启动 昆山11:45:0011:48:00 苏州12:12:0012:16:00 无锡12:44:0012:55:00 常州13:22:0013:26:00 镇江14:13:0014:16:00 南京15:04:0015:16:00 蚌埠17:27:0017:50:00 徐州19:38:0019:58:00 商丘22:12:0022:17:00 开封23:49:0023:53:00 郑州00:37:0001:14:00 新乡02:20:0002:22:00 鹤壁03:01:0003:03:00 安阳03:33:0003:36:00 邯郸04:11:0004:16:00 邢台04:47:0004:51:00 石家庄06:05:00None Processfinishedwithexitcode0 #Python标准库#Xml (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |