python-minidom模块【解析xml】
1,xml的文档结构
1.1,XML文档包括XML头信息和XML信息体
1.1.1,XML文档头信息
- <?xml version="1.0" encoding="utf-8"?>
它表明了此XML文档所用的版本,编码方式。有些复杂的还有一些文档类型的定义(DOCTYPE),用于定义此XML文档所用的DTD或Schema和一些实体的定义。
1.1.2,XML文档信息体
- <Table>
- <Name>
- tbl_test
- </Name>
- <Comment>
- This ia a test table
- </Comment>
- <Schema format="Json">
- </Schema>
- </Table>
XML信息体是由树状元素组成。每个XML文档都有一个文档元素,也就是树的根元素,所有其它的元素和内容都包含在根元素中。
DOM是Document Object Model的简称,它是以对象树来表示一个XML文档的方法,使用它的好处就是你可以非常灵活的在对象中进行遍历。
2,minidom模块读取XML
按照我的理解,在获得XML文档树的根节点后,实际上分为两种节点【这里测试只用到这两种节点,实际按照nodeType知道还有其他很多】:元素节点(ELEMENT NODE)和文本节点(TEXT NODE)。元素节点如上面的Name标签,整个就是一个元素节点。文本节点如上面的tbl_test,也作为一个节点,即文本节点。
节点都具有这样三种属性;
| node.nodeName | nodeName为结点名字 |
| node.nodeValue | nodeValue是结点的值,只对文本结点有效 |
| node.nodeType | nodeType是结点的类型 |
元素节点(ELEMENT NODE)可以用root.getElementsByTagName("Table")这样来获取以Table标签的一个列表。
文本节点(TEXT NODE) 可以用column.getAttribute('Name')这样来获取Name的这样一个属性值。属性指的是: <Column Name="pt" Value="1"/>这样的结构。可以使用node.data或者node.nodeValue来获取文本值。
2.1,得到dom对象
从xml文件得到dom对象
- >>> import xml.dom.minidom
- >>> dom = xml.dom.minidom.parse('d:/catalog.xml')
从xml字符串得到dom对象
- >>> import xml.dom.minidom
- >>> dom = xml.dom.minidom.parseString(xmlstring)
2.2,得到文档元素对象
- >>> root = dom.documentElement
3,测试
3.1,实验1
- <?xml version="1.0" encoding="UTF-8"?>
- <Table>
- <Name>
- tbl_test
- </Name>
- <Comment>
- This ia a test table
- </Comment>
- <Schema format="Json">
- </Schema>
- </Table>
- dom = parseString(string1)
- #root = dom.documentElement
- table = dom.getElementsByTagName( "Table" )[0]
- name = table.getElementsByTagName( "Name" )[0]
- for textNode in name.childNodes:
- print textNode.data
- print textNode.nodeValue
1,dom获得的是整个xml对象
2,【未运行】root获得的整个文档对象,如果执行了,实际上得到的是根节点唯一的标签<Table></Table>下的东西,如果有多个<Table></Table>,估计会忽略,默认把第一个当成根。
3,root.getElementsByTagName( "Table" )将获得所有<Table></Table>标签对,这是一个类似于列表的东西,可以用列表方法获取。因为这里就一个<Table></Table>标签,所以直接[0]返回这个单独的对象。
4,table获得的是真正的单个的其中的<table></Table>对象。
5,table.getElementsByTagName( "Name" )同样获得的是一个[<Name></Name>,...,<Name></Name>]这样的列表。
6,name获得的是单个的现在仅有的<Name></Name>对象。
7,由于name下面是文本节点tbl_test。虽然只有一个,但可以有多个。此时,前述的都是元素节点,Name标签下都是文本节点了,可以用name.childNodes获得文本节点列表,注意,还是列表。
8,textNode是其中的唯一的一个tbl_test。
9,因为是文本节点,所有有data属性。当然其,node.nodeValue也可以读到。
3.2,实验2
- <?xml version="1.0" encoding="UTF-8"?>
- <Partitions>
- <Partition>
- <Column Name="pt" Value="1"/>
- </Partition>
- </Partitions>
- dom = parseString(string2)
- #root = dom.documentElement
- partitions = dom.getElementsByTagName("Partitions")[0]
- partition = partitions.getElementsByTagName("Partition")[0]
- column = partition.getElementsByTagName("Column")[0]
- print column.getAttribute('Name')
1,dom获得的是整个xml对象
2,【未运行】root获得的整个文档对象,如果执行了,实际上得到的是根节点唯一的标签<Table></Table>下的东西,如果有多个<Partitions></Partitions>,估计会忽略,默认把第一个当成根。
3,root.getElementsByTagName( "Partitions" )将获得所有<Partitions></Partitions>标签对,这是一个类似于列表的东西,可以用列表方法获取。因为这里就一个<Partitions></Partitions>标签,所以直接[0]返回这个单独的对象。
4,partitions获得的是真正的单个的其中的<Partitions></Partitions>对象。
5,partitions.getElementsByTagName( "Partition" )同样获得的是一个[<Partition></Partition>,...,<Partition></Partition>]这样的列表。
6,partition获得的是单个的现在仅有的<Partition></Partition>对象。
7,column以同样方式获取到单个的<Column></Column>对象
8,由于Name是Column的一个属性,所以用column.getAttribute('Name')来获取这个属性值
3.3,实验3
- string1='''<?xml version="1.0" encoding="UTF-8"?>
- <Table>
- <Name>
- tbl_test
- </Name>
- <Comment>
- <Name>
- gexing
- </Name>
- This ia a test table
- </Comment>
- <Schema format="Json">
- </Schema>
- <Name>
- dandan
- </Name>
- </Table>
- '''
- dom = parseString(string1)
- root = dom.documentElement
- names = root.getElementsByTagName("Name")
- for name in names:
- for child in name.childNodes:
- print child.nodeValue
输出:
- [admin@r42h06016.xy2.aliyun.com]$python test.py
- tbl_test
- gexing
- dandan
注意点1,空行是因为实际上要的xml是无空格的内容。
注意点2,说明用getElementsByTagName得到的list是遍历所有“节点”,然后不管哪个层次,遇到一个符合的就会加进来。如果没有文本信息,就输出None。
3.4,简单函数
对于简单的元素,如:<caption>Python</caption>,我们可以编写这样一个函数来得到它的内容(这里为Python)。
- def getTagText(root, tag):
- node = root.getElementsByTagName(tag)[0]
- rc = ""
- for node in node.childNodes:
- if node.nodeType in ( node.TEXT_NODE, node.CDATA_SECTION_NODE):
- rc = rc + node.data
- return rc
4,xml.etree.ElementTree模块读xml
- import xml.etree.ElementTree
- content = xml.etree.ElementTree.fromstring(string1)
- name = content.findall('Name')#找到所有的Name的列表
- name = content.findtext('Name')#找到下一层的Name节点
python-minidom模块【解析xml】的更多相关文章
- Python requests模块解析XML
检查QQ是否在线(api感觉不准) import requests from xml.etree import ElementTree qq_str = input('please input the ...
- python 之模块之 xml.dom.minidom解析xml
# -*- coding: cp936 -*- #python 27 #xiaodeng #python 之模块之 xml.dom.minidom解析xml #http://www.cnblogs.c ...
- python XML文件解析:用xml.dom.minidom来解析xml文件
python解析XML常见的有三种方法: 一是xml.dom.*模块,是W3C DOM API的实现,若需要处理DOM API则该模块很合适, 二是xml.sax.*模块,它是SAX API的实现,这 ...
- python常用模块之xml模块
python常用模块之xml模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,在json还没诞生的年代,大家都是使用xml,目前很多传统公司的系 ...
- Python minidom模块(DOM写入和解析XML)
一.DOM写XML文件 #导入minidom from xml.dom import minidom # 1.创建DOM树对象 dom=minidom.Document() # 2.创建根节点.每次都 ...
- python xml.dom模块解析xml
1. 什么是xml?有何特征? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 例子:del.xml <?xml version=&q ...
- [python]使用ElementTree解析XML【译】
19.7 The ElementTree XML API 源码:Lib/xml/etree/ElementTree.py Element类型是一个灵活的容器对象,设计出来是用于存储有层次的数据结构到内 ...
- ZH奶酪:Python使用ElementTree解析XML【译】
19.7. xml.etree.ElementTree — The ElementTree XML API 源代码: Lib/xml/etree/ElementTree.py Element类型是一种 ...
- python练习三—解析xml
使用python解析xml,主要使用sax的ContentHandler中的标签开始和标签结束的方法驱动,然后在开始(或者结束)事件中决定使用什么处理方法,使用dispatcher来决定并分发到指定方 ...
- python使用SAX解析xml
python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件 在python中使用sax方式处理xml要先引入xml.s ...
随机推荐
- IOC 之深入理解 Spring IoC
在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,本篇为[死磕 Spring]系列博客的第一篇博文,主要 ...
- openstack neutron 二/三层网络实现
引用声明:https://zhangchenchen.github.io/2017/02/12/neutron-layer2-3-realization-discovry/ 一.概述 Neutron是 ...
- 必须掌握的30种SQL语句优化
1.’对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用 ...
- 【Algorithm】选择排序
一. 算法描述 选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1 ...
- SAP升级ECC6.0 引起的一个事故
上个月底,公司的SAP系统升级到了ECC6,在升级时,我们进行了所有关联系统的集成测试,当时没有发现什么问题. 过了2周,需要从SAP下载对账单了,这个时候问题出现了,很多分公司的数据下载失败.和SA ...
- 基于matplotlib的数据可视化 - 饼状图pie
绘制饼状图的基本语法 创建数组 x 的饼图,每个楔形的面积由 x / sum(x) 决定: 若 sum(x) < 1,则 x 数组不会被标准化,x 值即为楔形区域面积占比.注意,该种情况会出现 ...
- thinkphp导航高亮的方法
因为引入了公共的 header.html,所以需要使用 js来实现向 li 加入active的高亮属性,这里我通过url地址和href的地址进行判断 // 这里对当前页面导航高亮 $(function ...
- 【转】我离开了 Coverity
我离开了 Coverity 在写这篇博文的时候,我已经不再是 Coverity 的员工了,我已经在今天下午向公司正式辞职. 走出公司的大门,我觉得一身的轻松.这是我几个月以来第一次感受到加州美丽的阳光 ...
- JAVA Socket编程和C++ Socket编程有什么不同
原文链接: http://zhidao.baidu.com/link?url=16TEzhom2Nr8x1_2uTRp-e2pgZRgS5nW5ywtRX2XLHbtLOG8btif5DTyP85jf ...
- PNG怎么转换成32位的BMP保持透明
32位BMP位图的格式是XRGB,就是X8位 R8位 G8位 B8位,当中的X8可以作为Alpha值用于透明, 只需要搜索一下PNG转32位BMP位图的软件就可以了,另外用PhotoShop下载插件打 ...