元素节点、元素树

>>> from xml.etree.ElementTree import parse
>>> help(parse)
Help on function parse in module xml.etree.ElementTree: parse(source, parser=None)

help(parse)

>>> f  = open(r'C:\视频\python高效实践技巧笔记\6数据编码与处理相关话题\linker_log.xml')
>>>
>>> et = parse(f) #et ElementTree的对象
>>> help(et.getroot)
Help on method getroot in module xml.etree.ElementTree: getroot(self) method of xml.etree.ElementTree.ElementTree instance

help(et.getroot)

>>> root = et.getroot() #获取根节点 是一个元素对象

>>> root
<Element 'DOCUMENT' at 0x2e87f90>

#此节点的属性

>>> root.tag               #查看标签
'DOCUMENT' >>> root.attrib #查看属性,是一个字典,本例中有值,无值时为空
{'gen_time': 'Fri Dec 01 16:04:26 2017 '} >>> root.text #查看节点文本,是一个回车无自符串
'\n'
>>> root.text.strip() #将节点文本对 空白字符串过滤
''

>>> root.text.strip()

 ''

#root自身是一个可迭代对象,直接进行迭代遍历子元素

>>> for child in root:
print(child.get('id')) #child表示子元素 get()方法是获取某一属性。

输出结果

01ABBC90

01BF8610

01BF8AF0

01BFC5F0

01BFE3E8

01BFE850

01BFEAC8

01BFF128

01BFF2B0

01BFF4B8

01BFF730

01BFF960

01BFFB68

#通过find()、findall()、iterfind()只能找当前元素的直接子元素如本例中”root”只能找”MSG”而不能找”TEXT”

>>> root.find('MSG')       #find()找到第一个碰到的元素
<Element 'MSG' at 0x2e87fd0>
>>> root.find('MSG')
<Element 'MSG' at 0x2e87fd0>
>>> root.findall('MSG') #find()找到所有的元素
[<Element 'MSG' at 0x2e87fd0>, <Element 'MSG' at 0x2e9f0d0>, <Element 'MSG' at 0x2e9f170>, <Element 'MSG' at 0x2e9f210>, <Element 'MSG' at 0x2e9f2b0>, <Element 'MSG' at 0x2e9f350>, <Element 'MSG' at 0x2e9f3f0>, <Element 'MSG' at 0x2e9f490>, <Element 'MSG' at 0x2e9f530>, <Element 'MSG' at 0x2e9f5d0>, >>> root.find('TEXT') #“TEXT”是”MSG”的子元素,所以root直接find()找不到
>>>
>>> msg = root.find('MSG')
>>> msg.find('TEXT')
<Element 'TEXT' at 0x2e9f090> #iterfind() 生成可迭代对表
>>> iterMsg = root.iterfind('MSG')
>>> for i in xrange(5):
x = iterMsg.next()
print x.get('id')

输出

01BF8610

01BF8AF0

01BFC5F0

01BFE3E8

01BFE850

>>> iterMsg = root.iterfind('MSG')
>>> i = 0
>>> for x in iterMsg:
print(x.get('id'))
i+=1
if(i ==5):
break

输出结果:

01ABBC90

01BF8610

01BF8AF0

01BFC5F0

01BFE3E8

#iter()可以迭代出所有元素的节点

>>> root.iter()
<generator object iter at 0x02ED3CD8>

#递归查找某一元素

>>> list(root.iter('TEXT'))

三、查找高级用法

1、“*”查找所有的节点

>>> root.findall('MSG/*')   #查找MSG下的所有子节点,注意只能找其子节点而不能找其孙子节点

2、“.//”无论哪个层次下都能找到节点

>>> root.find('.//TEXT')        #能找到
<Element 'TEXT' at 0x2e9f090>
>>> root.find('TEXT') #不能找到
>>>

3、“..”找到父层次的节点

>>> root.find('.//TEXT/..')
<Element 'MSG' at 0x2e87fd0>

4、“@”包含某一属性

>>> root.find('MSG[@name]')          #没有包含name属性的
>>> root.find('MSG[@Type]') #没有包含Type属性的
>>> root.find('MSG[@type]') #存在包含type属性的,并返回
<Element 'MSG' at 0x2e87fd0>

5、属性等于特定值

>>> root.find('MSG[@id="01BFE3E8"]')   #注意参数里的=号后面的字符串需要带引号
<Element 'MSG' at 0x2e9f2b0>

6、指定序号

>>> root.find("MSG[2]")      #找第二个
<Element 'MSG' at 0x2e9f0d0> >>> root.find("MSG[last()]") #找最后一个
<Element 'MSG' at 0x2ecdef0> >>> root.find("MSG[last()-1]") #找倒数第二个
<Element 'MSG' at 0x2ecde30>

6-3 如何解析简单的XML文档的更多相关文章

  1. SAX解析和生成XML文档

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...

  2. 使用dom解析器对xml文档内容进行增删查改

    直接添代码: XML文档名称(one.xml) <?xml version="1.0" encoding="UTF-8" standalone=" ...

  3. 用python批量生成简单的xml文档

    最近生成训练数据时,给一批无效的背景图片生成对应的xml文档,我用python写了一个简单的批量生成xml文档的demo,遇见了意外的小问题,记录一下. 报错问题为:ImportError: No m ...

  4. Dom4j解析语音数据XML文档(注意ArrayList多次添加对象,会导致覆盖之前的对象)

    今天做的一个用dom4j解析声音文本的xml文档时,我用ArrayList来存储每一个Item的信息,要注意ArrayList多次添加对象,会导致覆盖之前的对象:解决方案是在最后将对象添加入Array ...

  5. WSDL 文档-一个简单的 XML 文档

    WSDL 文档是利用这些主要的元素来描述某个 web service 的: <portType>-web service 执行的操作 <message>-web service ...

  6. MVC模式简单的Xml文档解析加Vue渲染

    前端代码: <script src="~/Js/jquery-3.3.1.min.js"></script> <script src="~/ ...

  7. Java DOM解析器 - 修改XML文档

    这是我们需要修改的输入XML文件: 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="UTF-8&q ...

  8. Java DOM解析器 - 查询XML文档

    这是需要我们查询的输入XML文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?xml version="1.0"?> ...

  9. iOS网络编程笔记——XML文档解析

    今天利用多余时间研究了一下XML文档解析,虽然现在移动端使用的数据格式基本为JSON格式,但是XML格式毕竟多年来一直在各种计算机语言之间使用,是一种老牌的经典的灵活的数据交换格式.所以我认为还是很有 ...

随机推荐

  1. 使用jquery给html标签加点击事件

    //直接给所有img标签绑定click事件 $("img").click(function(){ alert('你点击了图片'); }) //使用bind方法绑定click事件 $ ...

  2. Tire树模板-于是他错误的点名开始了

    题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). ...

  3. D5000系统使用手册--AVC

    有关概念: AVC:自动电压控制 PAS:网络分析应用 SCADA:电网稳态监控应用 闭环:AVC由SCADA系统获得电网的实时运行状态,分析计算后发出控制指令,电网运行状态变化后反馈回AVC,形成闭 ...

  4. 《Effective Java》读书笔记 - 4.类和接口

    Chapter 4 Classes and Interfaces Item 13: Minimize the accessibility of classes and members 一个好的模块设计 ...

  5. bootstrap-table export导出问题

    引入方式如上图,首先是,bootstrap.min.js,其他 Bootstrap Table 官网 bootstrap-table.min.js  // 表格 bootstrap-table-zh- ...

  6. PTA编程总结二

    7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成“贰万叁仟壹百零捌”元.为了简化输出,用小写英文字 ...

  7. spring boot shiro redis整合基于角色和权限的安全管理-Java编程

    一.概述 本博客主要讲解spring boot整合Apache的shiro框架,实现基于角色的安全访问控制或者基于权限的访问安全控制,其中还使用到分布式缓存redis进行用户认证信息的缓存,减少数据库 ...

  8. a = a + b 与 a += b 的区别

    1.对于同样类型的a,b来说 两个式子执行的结果确实没有什么区别.但是从编译的角度看吧(武让说的),a+=b;执行的时候效率高. 2.对于不同类型的a,b来说 2.1    不同类型的两个变量在进行运 ...

  9. leetcode-mid-math-172. Factorial Trailing Zeroes-NO-????

    mycode 问题:为甚在小于200的时候,答案ok,大于等于200的时候,就少一个1??? class Solution(object): def trailingZeroes(self, n): ...

  10. 初步理解JS的事件机制

    一.事件流(捕获,冒泡)   事件流:指从页面中接收事件的顺序,有冒泡流和捕获流. 当页面中发生某种事件(比如鼠标点击,鼠标滑过等)时,毫无疑问子元素和父元素都会接收到该事件,可具体顺序是怎样的呢?冒 ...