标准库系列之xml模块(package,标签,程序,开发技术)

时间:2024-05-05 06:21:19 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

Python标准库系列之xml模块


Python’s interfaces for processing XML are grouped in the xml package.

带分隔符的文件仅有两维的数据:行和列。如果你想在程序之间交换数据结构,需要一种方法把层次结构、序列、集合和其他的结构编码成文本。


XML是最突出的处理这种转换的标记(markup)格式,它使用标签(tag)分个数据,如下面的实例文件menu.xml所示:

<?xmlversion="1.0"encoding="utf-8"?><feedxmlns="http://www.w3.org/2005/Atom"><title>安生&#39;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的一些重要特性

  1. 标签以一个<字符开头,例如实例中的feed、title、subtitle、author。

  2. 忽略空格

  3. 通常一个开始标签跟一段其他的内容,然后是最后相匹配的结束标签,例如

    大好时光!
  4. 标签之间是可以存在多级嵌套的

  5. 可选属性(attribute)可以出现在开始标签里

  6. 标签中可以包含值(value)

  7. 如果一个命名为thing的标签内没有内容或者子标签,那么它可以用在右尖括号的前面添加斜杠的简单标签所表示,例如

    代替开始和结束都存在的标签。

  8. 存放数据的位置可以是任意的—-属性、值或者子标签。

XML通常用于数据传送和消息,它存在一些子格式,如RSS和Atom,例如:https://blog.ansheng.me/atom.xml

在Python中解析XML最简单的方法是使用ElementTree

模块说明xml.etree.ElementTreethe ElementTree API, a simple and lightweight XML processor

创建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模块

创建一个有换行的XML文件

代码

fromxml.etreeimportElementTreeasETfromxml.domimportminidomroot=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

first.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>

first.xml文件在/root目录下

利用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)...year2025year2028year2028

增、删、改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)...#节点内容为空{}{}{}

修改节点内容

修改year内的数字自加1

>>>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)...202520282028#写入文件中>>>tree.write("first.xml")>>>fornodeinroot.iter("year"):#输出写入文件之后year的内容...print(node.text)...202620292029

对节点操作的方法

获取节点的方法

>>>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']

方法有这么多,那么我们常用的也就是下面的几个

方法名说明tag获取tag标签名attrib获取节点的属性find获取节点的内容iter进行迭代set设置属性get获取属性

实例

判断QQ是否在线

腾讯提供了能够查看QQ号码是否在线的API,Y=在线;N=离线;E=QQ号码错误;A=商业用户验证失败;V=免费用户超过数量

>>>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.textroot=ET.XML(result)fornodeinroot.iter('TrainDetailInfo'):print(node.find('TrainStation').text,node.find('ArriveTime').text,node.find("StartTime").text)

执行结果

C:\Python35\python.exeF:/Python_code/sublime/Week5/Day01/xml_mod.py上海(车次:K234\K235)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:00NoneProcessfinishedwithexitcode0


#Python标准库#Xml


 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:标准库系列之xml模块的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:elasticsearch 相似推荐下一篇:

6 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18