1,xml的文档结构

1.1,XML文档包括XML头信息和XML信息体

1.1.1,XML文档头信息

  1. <?xml version="1.0" encoding="utf-8"?>

它表明了此XML文档所用的版本,编码方式。有些复杂的还有一些文档类型的定义(DOCTYPE),用于定义此XML文档所用的DTD或Schema和一些实体的定义。

1.1.2,XML文档信息体

  1. <Table>
  2. <Name>
  3. tbl_test
  4. </Name>
  5. <Comment>
  6. This ia a test table
  7. </Comment>
  8. <Schema format="Json">
  9. </Schema>
  10. </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对象

  1. >>> import xml.dom.minidom
  2. >>> dom = xml.dom.minidom.parse('d:/catalog.xml')

从xml字符串得到dom对象

  1. >>> import xml.dom.minidom
  2. >>> dom = xml.dom.minidom.parseString(xmlstring)

2.2,得到文档元素对象

  1. >>> root = dom.documentElement

3,测试

3.1,实验1

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Table>
  3. <Name>
  4. tbl_test
  5. </Name>
  6. <Comment>
  7. This ia a test table
  8. </Comment>
  9. <Schema format="Json">
  10. </Schema>
  11. </Table>
  1. dom = parseString(string1)
  2. #root = dom.documentElement
  3. table  =  dom.getElementsByTagName( "Table" )[0]
  4. name  =  table.getElementsByTagName( "Name" )[0]
  5. for textNode in name.childNodes:
  6. print textNode.data
  7. 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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Partitions>
  3. <Partition>
  4. <Column Name="pt" Value="1"/>
  5. </Partition>
  6. </Partitions>
  1. dom = parseString(string2)
  2. #root = dom.documentElement
  3. partitions = dom.getElementsByTagName("Partitions")[0]
  4. partition = partitions.getElementsByTagName("Partition")[0]
  5. column = partition.getElementsByTagName("Column")[0]
  6. 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

  1. string1='''<?xml version="1.0" encoding="UTF-8"?>
  2. <Table>
  3. <Name>
  4. tbl_test
  5. </Name>
  6. <Comment>
  7. <Name>
  8. gexing
  9. </Name>
  10. This ia a test table
  11. </Comment>
  12. <Schema format="Json">
  13. </Schema>
  14. <Name>
  15. dandan
  16. </Name>
  17. </Table>
  18. '''
  1. dom = parseString(string1)
  2. root = dom.documentElement
  3. names = root.getElementsByTagName("Name")
  4. for name in names:
  5. for child in name.childNodes:
  6. print child.nodeValue

输出:

  1. [admin@r42h06016.xy2.aliyun.com]$python test.py
  2. tbl_test
  3. gexing
  4. dandan

注意点1,空行是因为实际上要的xml是无空格的内容。

注意点2,说明用getElementsByTagName得到的list是遍历所有“节点”,然后不管哪个层次,遇到一个符合的就会加进来。如果没有文本信息,就输出None。

3.4,简单函数

对于简单的元素,如:<caption>Python</caption>,我们可以编写这样一个函数来得到它的内容(这里为Python)。

  1. def getTagText(root, tag):
  2. node = root.getElementsByTagName(tag)[0]
  3. rc = ""
  4. for node in node.childNodes:
  5. if node.nodeType in ( node.TEXT_NODE, node.CDATA_SECTION_NODE):
  6. rc = rc + node.data
  7. return rc

4,xml.etree.ElementTree模块读xml

  1. import xml.etree.ElementTree
  2. content = xml.etree.ElementTree.fromstring(string1)
  3. name = content.findall('Name')#找到所有的Name的列表
  4. name = content.findtext('Name')#找到下一层的Name节点

python-minidom模块【解析xml】的更多相关文章

  1. Python requests模块解析XML

    检查QQ是否在线(api感觉不准) import requests from xml.etree import ElementTree qq_str = input('please input the ...

  2. python 之模块之 xml.dom.minidom解析xml

    # -*- coding: cp936 -*- #python 27 #xiaodeng #python 之模块之 xml.dom.minidom解析xml #http://www.cnblogs.c ...

  3. python XML文件解析:用xml.dom.minidom来解析xml文件

    python解析XML常见的有三种方法: 一是xml.dom.*模块,是W3C DOM API的实现,若需要处理DOM API则该模块很合适, 二是xml.sax.*模块,它是SAX API的实现,这 ...

  4. python常用模块之xml模块

    python常用模块之xml模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,在json还没诞生的年代,大家都是使用xml,目前很多传统公司的系 ...

  5. Python minidom模块(DOM写入和解析XML)

    一.DOM写XML文件 #导入minidom from xml.dom import minidom # 1.创建DOM树对象 dom=minidom.Document() # 2.创建根节点.每次都 ...

  6. python xml.dom模块解析xml

    1. 什么是xml?有何特征? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 例子:del.xml <?xml version=&q ...

  7. [python]使用ElementTree解析XML【译】

    19.7 The ElementTree XML API 源码:Lib/xml/etree/ElementTree.py Element类型是一个灵活的容器对象,设计出来是用于存储有层次的数据结构到内 ...

  8. ZH奶酪:Python使用ElementTree解析XML【译】

    19.7. xml.etree.ElementTree — The ElementTree XML API 源代码: Lib/xml/etree/ElementTree.py Element类型是一种 ...

  9. python练习三—解析xml

    使用python解析xml,主要使用sax的ContentHandler中的标签开始和标签结束的方法驱动,然后在开始(或者结束)事件中决定使用什么处理方法,使用dispatcher来决定并分发到指定方 ...

  10. python使用SAX解析xml

    python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件 在python中使用sax方式处理xml要先引入xml.s ...

随机推荐

  1. IT公司管理发展经验

        2012-11-14 内容存档在evernote,笔记名"IT公司管理发展经验"

  2. elk之elasticsearch 入门

    一.概述: 1.查看elasticsearch集群的健康状况: [root@node115 kibana]# curl -X GET http://192.168.39.115:9200/_cat/h ...

  3. atom介绍

    在公司微信群,看到activate-power-mode插件的效果,很绚丽,才知道github自己出了一个自己的编辑器atom 官网地址 https://atom.io 官网看了下,atom编辑器的特 ...

  4. mvc 权限验证

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  5. AndroidStudio编译错误:Error: null value in entry: blameLogFolder=null

    今天写项目的时候,电脑开了个WiFi热点,然后这个热点和window驱动不兼容,有时候会导致电脑重启,重启之后AndroidStudio编译就报错了, Error: null value in ent ...

  6. 在vmware fusion上安装linux系统然后再安装vmware tools出现问题

    /usr/lib/vmware-tools] In which directory do you want to install the documentation files? [/usr/shar ...

  7. 搭建MVC及WEB API项目框架时碰到的问题集合

    前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说 ...

  8. xbox360 双65厚机自制系统无硬盘 U盘玩游戏方法

    因为没有硬盘,又没有光盘.所以想把游戏放在U盘里面.用U盘来做为硬盘玩游戏. 现有的自制系统主要是FSD,但是FSD要用硬盘才能安装,理论上U盘也可以,但是我没有尝试了. 这里介绍的是玩xex格式的游 ...

  9. logstash 如何处理 mongodb 导出来的 _id value数据。 how to custom fields of logstash by mongo mapreduce exported data.(example format: {_id:"xxx"} , value:{})

    input { file { path => "c:\aa.json" start_position => "beginning" #sincedb ...

  10. SpringBoot+SpringAOP+Java自定义注解+mybatis实现切库读写分离

    一.定义我们自己的切库注解类 自定义注解有几点需要注意: 1)@Target 是作用的目标,接口.方法.类.字段.包等等,具体看:ElementType 2)@Retention 是注解存在的范围,R ...