XML

XML指可扩展标记语言(Extensible Markup Language)

XML被设计用于结构化、存储和传输数据

XML是一种标记语言,很类似于HTML

XML没有像HTML那样具有预定义标签,需要程序员自定义标签。

XML被设计为具有自我描述性,并且是W3C的标准

<html>
<head>
<title>gloryroad test</title>

</head>
<body>
<h1>标题1</h1>
<h2>标题2</h2>
<h3>标题3</h3>
<h4>标题4</h4>
<h5>标题5</h5>
<h6>标题1</h6>

<p><i><b>I am a boy! </b></i></p>
</br>
<div>
<table>
<th>company</th>
<tr><td>gloryroad1</td></tr>
<tr><td>gloryroad2</td></tr>
<tr><td>gloryroad3</td></tr>
</table>
</div>

<a href="http://www.gloryroad.cn" target ="_blank"> gloryroad</a>
<a href="http://www.gloryroad.cn"><img  src="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top_ca79a146.png">pic</img></a>

<form method = "POST" action="sssss.asp" >
<input type="text">用户名 </input>
<input type="password">密码 </input>
<input type="submit" value="提交"> </input>

</form>
<textarea cols=200> </textarea>
</body>

</html>

XML文档(树结构)

<root>

<child>

<subchild>....</subchild>

</child>

</root>

XML文档形成了一种树结构,它从“根部”开始,然后扩展到“树枝”。

XML文档必须包含根元素,该元素是所有其他元素的父元素,文档中的所有元素形成了一棵文档树,这课树从根开始,并扩展到树的最顶端,并且所有的元素都可以有子元素。

父元素拥有子元素,相同层级上的子元素成为同胞(兄弟或姐妹)。

XML中所有子元素都可以有文本内容和属性,类似于HTML

XML基础知识介绍

XML的元素是指从开始标签直到结束标签的部分(均包括开始结束)。

一个元素可以包含:

1、其他元素

2、文本

3、属性

4、或混合以上所有

XML元素 XML语法规则

ü所有的XML元素都必须有一个开始标签和结束标签,省略结束标签是非法的。如: <root> content </root>

üXML标签对大小写敏感;比如: 下面是两个不同的标签 <Note>this is a test1</Note> <note>this is a test2</note>

XML基础知识介绍

XML文档必须有根元素。如: <note> <b>this is a test2</b> <name>joy</name> </note>

XML必须正确嵌套,父元素必须完全包住子元素。如: <note><b>this is a test2</b></note>

üXML属性值必须加引号,元素的属性值都是一个键值对形式。如: <book category=" Python"></book> 注意:book元素中的属性category的值是python必须用引号引起来,使用单引号和双引号都可以,但是如果属性值本身包含双引号,外层就必须使用单引号;但如果包含了单引号,外层必须使用双引号。

XML命名规则

XML元素必须遵循以下命名规则:

Ø名称可以包含字母、数字以及其他字符

Ø名称不能以数字或标点符号开头

Ø名称不能以字母xml或XML开始

Ø名称不能包含空格

Ø可以使用任何名称,没有保留字

Ø名称应该具有描述性,简短和简单,可以同时使用下划线。

Ø避免“-”、“.”、“:”等字符。

XML注释格式为:

<!-- 注释内容 -->

CDATA

CDATA(Unparsed Character Data)指的是不应由XML解析器进行解析的文本数据。

因为XML解析器会将“<”(新元素的开始)和”&”(字符实体的开始)解析成具有特殊含义的字符,所以如果在文本中需要使用这些字符时,就必须使用实体引用去代替。但是有些文本,如JavaScript代码中会包含大量的”<”和”&”符号,这时我们可以将我们的脚本定义为CDATA来避免这个问题,因为XML文档中的所有文本均会被解析器解析,只有CDATA部分中所有的内容会被XML解析器忽略。

CDATA固定语法格式:

<![CDATA[“我们自己的代码"]]>

Python解析XML三种方法

1、SAX(simple API for XML)

Python标准库中包含SAX解析器,SAX是用的是事件驱动模型,通过在解析XML过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

解析的基本过程:

读到一个XML开始标签,就会开始一个事件,然后事件就会调用一系列的函数去处理一些事情,当读到一个结束标签时,就会触发另一个事件。所以,我们写XML文档入如果有格式错误的话,解析就会出错。

这是一种流式处理,一边读一边解析,占用内存少。

2、DOM(Document Object Model)

DOM是Document Object Model的简称,它是以对象树来表示一个XML文档的方法,使用它的好处就是你可以非常灵活的在对象中进行遍历。

将XML数据在内存中解析成一个树,通过对树的操作来操作XML。

由于DOM是将XML读取到内存,然后解析成一个树,如果要处理的XML文本比较大的话,就会很耗内存,所以DOM一般偏向于处理一些小的XML,(如配置文件)比较快。

3、ElementTree(Object Model)

ElementTree就像一个轻量级的DOM,具有方便而友好的API。代码的可用性好、速度快、消耗内存少。可以认为是对DOM的改进。

注意:DOM需要将XML数据映射到内存中的树,一是比较慢,而是比较耗内存,而SAX流式读取XML文件,比较快,占内存少,但需要用户实现回调函数(handler)。

Xml.dom解析XML

xml.dom解析xml思路

一个DOM的解析器在解析一个XML文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后利用DOM提供的不同函数来读取该文档的内容和结构,也可以把修改过的内容写入XML文件。

<?xml version="1.0" encoding="utf-8" ?>
<!--this is a test about xml.-->
<booklist type="science and engineering">
  <book category="math">
    <title>learning math</title>
    <author>张三</author>
    <pageNumber>561</pageNumber>
  </book>
  <book category="Python">
    <title>learning Python</title>
    <author>李四</author>
    <pageNumber>600</pageNumber>
  </book>
</booklist>

xml.dom解析xml常用API

minidom.parse(parser=None, bufsize=None)

该函数的作用是使用parse解析器打开xml文档,并将其解析为DOM文档,也就是内存中的一棵树,并得到这个DOM对象。

#coding=utf-8

#从xml.dom.minidom模块引入解析器parse

from xml.dom.minidom import parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树

DOMTree = parse(r"D:\XXX.xml")

print type(DOMTree)

c:\Python27\Scripts>python task_test.py

<type 'instance'>

xml.dom解析xml常用API

doc.documentElement

获取xml文档对象,就是拿到DOM树的根。

#coding=utf-8

from xml.dom.minidom import parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树

DOMTree = parse(r"D:\xxx.xml")

#获取xml文档对象,就是拿到树的根

booklist = DOMTree.documentElement

print booklist

c:\Python27\Scripts>python task_test.py

<DOM Element: booklist at 0x5908bc0>

获取xml文档函数 doc.toxml(encoding=None)

DOMTree.toxml()查看xml标签的内容是什么

-------------------------------------------------------------------------

from xml.dom.minidom import parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树

DOMTree = parse(r"D:\xxx.xml")

#获取xml文档对象,就是拿到树的根

booklist = DOMTree.documentElement

print u"DOM树的根对象:", booklist

print u"xml文档内容:\n%s" %DOMTree.toxml()

c:\Python27\Scripts>python task_test.py

DOM树的根对象: <DOM Element: booklist at 0x59fad78>

xml文档内容:

<?xml version="1.0" ?><!--this is a test about xml.--><booklist type="science and engineering">

  <book category="math">

    <title>learning math</title>

    <author>张三</author>

    <pageNumber>561</pageNumber>

  </book>

  <book category="Python">

    <title>learning Python</title>

    <author>李四</author>

    <pageNumber>600</pageNumber>

  </book>

</booklist>

判断是否包含属性

hasAttribute(name): 判断某个节点node是否存在某个属性,存在则返回True,否则返回False。

#coding=utf-8

from xml.dom.minidom import parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树

DOMTree = parse(r"D:\xxx.xml")

#获取xml文档对象,就是拿到树的根

booklist = DOMTree.documentElement

print u"DOM树的根对象:", booklist

 

if booklist.hasAttribute("type") :

  #判断根节点booklist是否有type属性

  print u"booklist元素存在type属性"

else :

  print u"booklist元素不存在type属性"

c:\Python27\Scripts>python task_test.py

DOM树的根对象: <DOM Element: booklist at 0x5a99df0>

booklist元素存在type属性

获取属性

node. getAttribute(attname),获取节点node的某个属性的值。

#coding=utf-8

from xml.dom.minidom import parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树

DOMTree = parse(r"D:\xxx.xml")

#获取xml文档对象,就是拿到树的根

booklist = DOMTree.documentElement

if booklist.hasAttribute("type") :

#判断根节点booklist是否有type属性,有则获取并打印属性的值

print "Root element is", booklist.getAttribute("type")

c:\Python27\Scripts>python task_test.py

Root element is science and engineering

获取节点元素

node.getElementsByTagName(name) 获取XML文档中某个父节点下具有相同节点名的节点对象集合,是一个list对象。

#coding=utf-8

from xml.dom.minidom import parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树

DOMTree = parse(r"D:\xxx.xml")

#获取xml文档对象,就是拿到树的根

booklist = DOMTree.documentElement

#获取booklist对象中所有book节点的list集合

books = booklist.getElementsByTagName("book")

print type(books)

print books

c:\Python27\Scripts>python task_test.py

<class 'xml.dom.minicompat.NodeList'>

[<DOM Element: book at 0x59f8d00>, <DOM Element: book at 0x5a00058>]

 

获取author节点

 

#coding=utf-8

 

#coding=utf-8

from xml.dom.minidom import parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树

DOMTree = parse(r"D:\xxx.xml")

#获取xml文档对象,就是拿到树的根

booklist = DOMTree.documentElement

#获取booklist对象中所有book节点的list集合

books = booklist.getElementsByTagName("book")

print type(books)

print books

author = booklist.getElementsByTagName("author")

print type(author)

print author

c:\Python27\Scripts>python task_test.py

<class 'xml.dom.minicompat.NodeList'>

[<DOM Element: book at 0x5438d00>, <DOM Element: book at 0x5440058>]

<class 'xml.dom.minicompat.NodeList'>

[<DOM Element: author at 0x5438eb8>, <DOM Element: author at 0x5440210>]

上面解析xml的程序中,getElementsByTagName()函数返回的是同一父节点下所有同级(即兄弟节点)节点中相同标签的集合,这是一个list对象,所以可以使用list序列所有操作。这个时候,我们可以通过索引去拿相应的节点,也可以使用节点名称去拿相应的节点,推荐第二种方法,准确。也可以通过循环遍历整个返回的list。

注意:

就算某个父节点下没有同名的节点,该方法返回的仍是一个list,只是此时的list为空。

node.childNodes

返回节点node下所有子节点组成的list。

#coding=utf-8

from xml.dom.minidom import parse #从xml.dom.minidom模块引入解析器parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树

DOMTree = parse(r"D:\xxx.xml")

#获取xml文档对象,就是拿到树的根

booklist = DOMTree.documentElement

#获取booklist对象中所有book节点的list集合

books = booklist.getElementsByTagName("book")

print books[0].childNodes

c:\Python27\Scripts>python task_test.py

[<DOM Text node "u'\n    '">, <DOM Element: title at 0x5418df0>, <DOM Text node "u'\n    '">, <DOM Element: author at 0x5418e90>, <DOM Text node "u'\n    '">, <DOM Element: pageNumber at 0x5418f30>, <DOM Text node "u'\n  '">]

把book[0]节点下所有子节点名称和内容列出来

#coding=utf-8

#从xml.dom.minidom模块引入解析器parse

from xml.dom.minidom import parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树

DOMTree = parse(r"d:\xxx.xml")

print type(DOMTree)

booklist = DOMTree.documentElement

print booklist

print "*"*30

books = booklist.getElementsByTagName("book")

d={}

for i in range(1,6,2):

tag_name =  books[1].childNodes[i].tagName

d[tag_name]=books[1].childNodes[i].childNodes[0].data

print d

for k,v in d.items():

print k,v

c:\Python27\Scripts>python task_test.py

<type 'instance'>

<DOM Element: booklist at 0x55a8bc0>

******************************

{u'author': u'\u674e\u56db', u'pageNumber': u'600', u'title': u'learning Python'}

author 李四

pageNumber 600

title learning Python

指示:

<?xml version="1.0" encoding="utf-8" ?>
<!--this is a test about xml.-->
<booklist type="science and engineering">
  <book category="math">
    <title>learning math</title>
    <author>张三</author>
    <pageNumber>561</pageNumber>
  </book>

#排序

0246文本节点回车

135是标签节点
  <book category="Python">0
    <title1>learning Python</title>2
    <author3>
李四</author>4
    <pageNumber5>600</pageNumber>6

  </book>
</booklist>

book[1].childnodes:0,1,2,3,4,5,6
<title1>\learning Python</title>
book[1].childnodes[1].childnodes---》列表
book[1].childnodes[1].childnodes[0]--->文本结点对象

book[1].childnodes[1].childnodes[0].data--->取到文本结点对象的具体内容值

练习:

1 自定义一个xml文件,包含数据库的ip地址,用户名、密码和数据库名称

2 将它从xml中读取出来,放到一个List里面

#coding=utf-8
#从xml.dom.minidom模块引入解析器parse
from xml.dom.minidom import parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树
DOMTree = parse(r"e:\database.xml")
#print type(DOMTree)

databases = DOMTree.documentElement

databases =databases.getElementsByTagName("database")

database_info =[]

for i in range(1,8,2):
    config_name = databases[0].childNodes[i].tagName
    config_value=databases[0].childNodes[i].childNodes[0].data
    database_info.append(config_name+":"+config_value)
print database_info

for i in database_info:
    print i

获取节点文本值

node.childNodes[index].data

获取节点node的文本值,即标签之间的文本内容

#coding=utf-8

import xml.dom.minidom

from xml.dom.minidom import parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树

DOMTree = xml.dom.minidom.parse(r"D:\xxx.xml")

#获取xml文档对象,就是拿到树的根

booklist = DOMTree.documentElement

if booklist.hasAttribute("type") :

#判断根节点booklist是否有type属性,有则获取并打印属性的值

print u"Root element is", booklist.getAttribute("type")

#获取booklist对象中所有book节点的list集合

books = booklist.getElementsByTagName("book")

print u"book节点的个数:", books.length

for book in books :

print "*******************book*******************"

if book.hasAttribute("category") :

print u"category is", book.getAttribute("category")

#根据结点名title拿到这个book结点下所有的title结点的集合list。

#[0]表示第一个title标签,因为一个<book>...</book>之间可能会

#定义多个title标签

title = book.getElementsByTagName('title')[0]

print "Title is", title.childNodes[0].data

author = book.getElementsByTagName('author')[0]

print "author is", author.childNodes[0].data

pageNumber = book.getElementsByTagName('pageNumber')[0]

print "pageNumber is", pageNumber.childNodes[0].data

c:\Python27\Scripts>python task_test.py

Root element is science and engineering

book节点的个数: 2

*******************book*******************

category is math

Title is learning math

author is 张三

pageNumber is 561

*******************book*******************

category is Python

Title is learning Python

author is 李四

pageNumber is 600

练习:获取title节点的个数:

#coding=utf-8
import xml.dom.minidom
from xml.dom.minidom import parse 
#minidom解析器打开xml文档并将其解析为内存中的一棵树
DOMTree = xml.dom.minidom.parse(r"e:\book.xml")
#获取xml文档对象,就是拿到树的根
booklist = DOMTree.documentElement

books = booklist.getElementsByTagName("book")
count =0 
for book in books :
  print "*******************book*******************"
  title = book.getElementsByTagName('title')
  count+= len(title)

print u"共有%s 个title" %str(count)

c:\Python27\Scripts>python task_test.py

*******************book*******************

*******************book*******************

共有2 title

X判断是否有子节点

node .hasChildNodes()

判断节点node下是否有叶子节点,如果有返回True,否则返回False。但是需要注意的是,每个节点都默认有一个文本叶子节点,所以只要标签后有值,就返回True,只有当标签后没值时并且也没有叶子节点时才会返回False 。

#coding=utf-8

import xml.dom.minidom

from xml.dom.minidom import parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树

DOMTree = xml.dom.minidom.parse(r"D:\xxx.xml")

#获取xml文档对象,就是拿到树的根

booklist = DOMTree.documentElement

#获取booklist对象中所有book节点的list集合

books = booklist.getElementsByTagName("book")

print u"book节点的个数:", books.length

print books[0]

if books[0].hasChildNodes():

print u"存在叶子节点\n", books[0].childNodes

else :

print u"不存在叶子节点"

c:\Python27\Scripts>python task_test.py

book节点的个数: 2

<DOM Element: book at 0x4e5aeb8>

存在叶子节点

[<DOM Text node "u'\n    '">, <DOM Element: title at 0x4e5afd0>, <DOM Text node "u'\n    '">, <DOM Element: author at 0x4e630a8>, <DOM Text node "u'\n    '">, <DOM Element: pageNumber at 0x4e63148>, <DOM Text node "u'\n  '">]

xml.dom解析xml的完整实例

xml文件:

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

<!--this is a test about xml.-->

<collection shelf="New Arrivals">

<movie title="Enemy Behind">

<type>War, Thriller</type>

<format>DVD</format>

<year>2003</year>

<rating>PG</rating>

<stars>10</stars>

<description>Talk about a US-Japan war</description>

</movie>

<movie title="Transformers">

<type>Anime, Science Fiction</type>

<format>DVD</format>

<year>1989</year>

<rating>R</rating>

<stars>8</stars>

<description>A schientific fiction</description>

</movie>

<movie title="Trigun">

<type>Anime, Action</type>

<format>DVD</format>

<episodes>4</episodes>

<rating>PG</rating>

<stars>10</stars>

<description>Vash the Stampede!</description>

</movie>

<movie title="Ishtar">

<type>Comedy</type>

<format>VHS</format>

<rating>PG</rating>

<stars>2</stars>

<description>Viewable boredom</description>

</movie>

</collection>

存成yyy.xml, utf-8格式

#coding=utf-8

from xml.dom.minidom import parse

import xml.dom.minidom

# 使用minidom解析器打开 XML 文档

DOMTree = xml.dom.minidom.parse(r"D:\yyy.xml")

collection = DOMTree.documentElement

if collection.hasAttribute("shelf"):

print "Root element : %s" % collection.getAttribute("shelf")

# 在集合中获取所有电影

movies = collection.getElementsByTagName("movie")

# 打印每部电影的详细信息

for movie in movies:

print "*****Movie*****"

if movie.hasAttribute("title"):

print "Title: %s" % movie.getAttribute("title")

type = movie.getElementsByTagName('type')[0]

print "Type: %s" % type.childNodes[0].data

format = movie.getElementsByTagName('format')[0]

print "Format: %s" % format.childNodes[0].data

rating = movie.getElementsByTagName('rating')[0]

print "Rating: %s" % rating.childNodes[0].data

description = movie.getElementsByTagName('description')[0]

print "Description: %s" % description.childNodes[0].data

c:\Python27\Scripts>python task_test.py

Root element : New Arrivals

*****Movie*****

Title: Enemy Behind

Type: War, Thriller

Format: DVD

Rating: PG

Description: Talk about a US-Japan war

*****Movie*****

Title: Transformers

Type: Anime, Science Fiction

Format: DVD

Rating: R

Description: A schientific fiction

*****Movie*****

Title: Trigun

Type: Anime, Action

Format: DVD

Rating: PG

Description: Vash the Stampede!

*****Movie*****

Title: Ishtar

Type: Comedy

Format: VHS

Rating: PG

Description: Viewable boredom

 

xml.dom创建XML文件

创建xml文件的步骤如下:

1、创建xml空文档

2、产生根对象

3、往根对象里加数据

4、把xml内存对象写到文件

创建xml空白文档

minidom.Document()

该方法用于创建一个空白的xml文档对象,并返回这个doc对象。

每个xml文档都是一个Document对象,代表着内存中的DOM树。

#coding=utf-8

import xml.dom.minidom

#在内存中创建一个空的文档

doc = xml.dom.minidom.Document()

print doc

c:\Python27\Scripts>python task_test.py

<xml.dom.minidom.Document instance at 0x04FFDE18>

创建xml文档根节点

doc.createElement(‘table’)

创建标签

#coding=utf-8

import xml.dom.minidom

#在内存中创建一个空的文档

doc = xml.dom.minidom.Document()

print doc

#创建一个根节点Managers对象

root = doc.createElement('Managers')

print u"添加的xml标签为:", root.tagName

c:\Python27\Scripts>python task_test.py

<xml.dom.minidom.Document instance at 0x054DDFD0>

添加的xml标签为: Managers

添加节点属性

#coding=utf-8

#coding=utf-8

import xml.dom.minidom

#在内存中创建一个空的文档

doc = xml.dom.minidom.Document()

print doc

#创建一个根节点Managers对象

root = doc.createElement('Managers')

print u"添加的xml标签为:", root.tagName

# 给根节点root添加属性

root.setAttribute('company', 'xx科技')

value = root.getAttribute('company')

print u"root元素的'company'属性值为:", value.decode('utf-8').encode('gbk')

c:\Python27\Scripts>python task_test.py

<xml.dom.minidom.Document instance at 0x05014030>

添加的xml标签为: Managers

root元素的'company'属性值为: xx科技

node.setAttribute(attname, value)

该方法表示给节点添加属性值对(Attribute) 。

参数说明:

attname :属性

添加文本节点

doc.createTextNode(data)

给叶子节点添加文本节点。

#coding=utf-8

import xml.dom.minidom

#在内存中创建一个空的文档

doc = xml.dom.minidom.Document()

print doc

#创建一个根节点Managers对象

root = doc.createElement('company')

print u"添加的xml标签为:", root.tagName

# 给根节点root添加属性

root.setAttribute('name', '光荣之路教育科技有限公司')

# 给根节点添加一个叶子节点

ceo = doc.createElement('CEO')

#给叶子节点name设置一个文本节点,用于显示文本内容

ceo.appendChild(doc.createTextNode('吴总'))#在ceo的节点上加的,不是加到根节点上

print ceo.tagName

print u"给叶子节点添加文本节点成功"

c:\Python27\Scripts>python task_test.py

<xml.dom.minidom.Document instance at 0x05014030>

添加的xml标签为: Managers

root元素的'company'属性值为: xx科技

添加子节点

doc/parentNode.appendChild(node)

将节点node添加到文档对象doc作为文档树的根节点或者添加到父节点parentNode下作为其子节点。

#coding=utf-8

import xml.dom.minidom

#在内存中创建一个空的文档

doc = xml.dom.minidom.Document()

#创建一个根节点company对象

root = doc.createElement('companys')

# 给根节点root添加属性

root.setAttribute('name', u'公司信息')

#将根节点添加到文档对象中

doc.appendChild(root)

# 给根节点添加一个叶子节点

company = doc.createElement('gloryroad')

# 叶子节点下再嵌套叶子节点

name = doc.createElement("Name")

# 给节点添加文本节点

name.appendChild(doc.createTextNode(u"光荣之路教育科技公司"))

ceo = doc.createElement('CEO')

ceo.appendChild(doc.createTextNode(u'吴总'))

# 将各叶子节点添加到父节点company中

# 然后将company添加到跟节点companys中

company.appendChild(name)

company.appendChild(ceo)

root.appendChild(company)

print doc.toxml()

c:\Python27\Scripts>python task_test.py

<?xml version="1.0" ?><companys name="公司信息"><gloryroad><Name>光荣之路教育科技公司</Name><CEO>吴总</CEO></gloryroad></companys>

生成XML文档

doc.writexml()

函数原型:

writexml(writer, indent='', addindent='', newl='', encoding=None)

该方法用于将内存中xml文档树写入文件中,并保存到本地磁盘。

上面我创建的xml文档仅是存在内存中的,并未真正写入硬盘,只有调用该方法以后,才能真正将我们创建的xml文档写入本地硬盘,这时我们才能在硬盘中看见新建的xml文档。

参数说明:

writer :要写的目标文件的文件对象。

indent :指明根节点缩进方式。

addindent:指明子节点缩进方式

newl : 针对新行,指明换行方式

encoding : 指明所写xml文档的编码

#coding=utf-8

import codecs

import xml.dom.minidom

#在内存中创建一个空的文档

doc = xml.dom.minidom.Document()

#创建一个根节点company对象

root = doc.createElement('companys')

# 给根节点root添加属性

root.setAttribute('name', u'公司信息')

#将根节点添加到文档对象中

doc.appendChild(root)

# 给根节点添加一个叶子节点

company = doc.createElement('gloryroad')

# 叶子节点下再嵌套叶子节点

name = doc.createElement("Name")

# 给节点添加文本节点

name.appendChild(doc.createTextNode(u"光荣之路教育科技公司"))

ceo = doc.createElement('CEO')

ceo.appendChild(doc.createTextNode(u'吴总'))

# 将各叶子节点添加到父节点company中

# 然后将company添加到跟节点companys中

company.appendChild(name)

company.appendChild(ceo)

root.appendChild(company)

#codecs就是一个编码解码器,如果不用的话,默认存成gbk

fp = codecs.open('D:\\company.xml', 'w','utf-8')

doc.writexml(fp, indent='', addindent='\t', newl='\n', encoding="utf-8")

fp.close()

练习:自己写一个xml的文件,例如:刚才的database的配置文件

需要改:

#coding=utf-8

import codecs

import xml.dom.minidom

doc=xml.dom.minidom.Document()

root=doc.createElement('database')

root.setAttribute('name',u'数据库信息')

doc.appendChild(root)

database=doc.createElement('oracle')

name=doc.createElement('Name')

name.appendChild(doc.createTextNode(u'xxx'))

passwd=doc.createElement('passwd')

passwd.appendChild(doc.createTextNode("123456"))

database.appendChild(name)

database.appendChild(passwd)

root.appendChild(database)

fp = codecs.open('D:\\database.xml', 'w','utf-8')

doc.writexml(fp, indent='', addindent='\t', newl='\n', encoding="utf-8")

fp.close()

import xml.dom.minidom

import codecs

# 在内存中创建一个空的文档

doc = xml.dom.minidom.Document()

# 创建一个根节点company对象

root = doc.createElement('database')

# 给根节点root添加属性

root.setAttribute('dbinfo', u'數據庫信息')

# 将根节点添加到文档对象中

doc.appendChild(root)

# 给根节点添加一个叶子节点

company = doc.createElement('userinfo')

# 叶子节点下再嵌套叶子节点

name = doc.createElement("root")

# 给节点添加文本节点

name.appendChild(doc.createTextNode(u"root"))

ceo = doc.createElement('password')

ceo.appendChild(doc.createTextNode('123456'))

host = doc.createElement('IP')

host.appendChild(doc.createTextNode('127.0.0.1'))

# 将各叶子节点添加到父节点company中

# 然后将company添加到跟节点companys中

company.appendChild(name)

company.appendChild(ceo)

company.appendChild(host)

root.appendChild(company)

print doc.toxml()

fp = codecs.open('company.xml', 'a+', 'utf-8')

doc.writexml(fp, indent='', addindent='\t', newl='\n', encoding="utf-8")

fp.close()

批量生成xml文件

#coding=utf-8

import xml.dom.minidom

#在内存中创建一个空的文档

doc = xml.dom.minidom.Document()

#创建一个根节点Managers对象

root = doc.createElement('Managers')

#设置根节点的属性

root.setAttribute('company', 'xx科技')

root.setAttribute('address', '科技软件园')

#将根节点添加到文档对象中

doc.appendChild(root)

managerList = [{'name' : 'joy',  'age' : 27, 'sex' : '女'},

{'name' : 'tom', 'age' : 30, 'sex' : '男'},

{'name' : 'ruby', 'age' : 29, 'sex' : '女'}  ]

for i in managerList :

nodeManager = doc.createElement('Manager')

nodeName = doc.createElement('name')

#给叶子节点name设置一个文本节点,用于显示文本内容

nodeName.appendChild(doc.createTextNode(str(i['name'])))

nodeAge = doc.createElement("age")

nodeAge.appendChild(doc.createTextNode(str(i["age"])))

nodeSex = doc.createElement("sex")

nodeSex.appendChild(doc.createTextNode(str(i["sex"])))

#将各叶子节点添加到父节点Manager中,

#最后将Manager添加到根节点Managers中

nodeManager.appendChild(nodeName)

nodeManager.appendChild(nodeAge)

nodeManager.appendChild(nodeSex)

root.appendChild(nodeManager)

#开始写xml文档

fp = open('D:\\Manager.xml', 'w')

doc.writexml(fp, indent='\t', addindent='\t', newl='\n', encoding="utf-8")

fp.close()

边读边解析

Movies.xml:

<collection shelf="New Arrivals">

<movie title="Enemy Behind">

<type>War, Thriller</type>

<format>DVD</format>

<year>2003</year>

<rating>PG</rating>

<stars>10</stars>

<description>Talk about a US-Japan war</description>

</movie>

<movie title="Transformers">

<type>Anime, Science Fiction</type>

<format>DVD</format>

<year>1989</year>

<rating>R</rating>

<stars>8</stars>

<description>A schientific fiction</description>

</movie>

<movie title="Trigun">

<type>Anime, Action</type>

<format>DVD</format>

<episodes>4</episodes>

<rating>PG</rating>

<stars>10</stars>

<description>Vash the Stampede!</description>

</movie>

<movie title="Ishtar">

<type>Comedy</type>

<format>VHS</format>

<rating>PG</rating>

<stars>2</stars>

<description>Viewable boredom</description>

</movie>

</collection>

获取根节点

import sys

try:

import xml.etree.cElementTree as ET

except ImportError:

import xml.etree.ElementTree as ET

tree = ET.ElementTree(file='movies.xml')

root=tree.getroot()

print root.tag

print root.attrib

for child_of_root in root:

print child_of_root.tag

print "********", child_of_root.attrib

 

c:\Python27\Scripts>python task_test.py

collection

{'shelf': 'New Arrivals'}

movie

******** {'title': 'Enemy Behind'}

movie

******** {'title': 'Transformers'}

movie

******** {'title': 'Trigun'}

movie

******** {'title': 'Ishtar'}

获取文本节点内容

import sys

try:

import xml.etree.cElementTree as ET

except ImportError:

import xml.etree.ElementTree as ET

tree = ET.ElementTree(file='movies.xml')

root=tree.getroot()

print "*"*50

print root[0].tag

print root[0].text  #“打印的内容为一个回车”

print root[0][0].tag

print root[0][0].text

c:\Python27\Scripts>python task_test.py

**************************************************

movie

 

 

type

War, Thriller

 

 

递归把xml文档所有的节点都取到

import sys

try:

    import xml.etree.cElementTree as ET

except ImportError:

    import xml.etree.ElementTree as ET

 

tree = ET.ElementTree(file='movies.xml')

 

print "*"*50

for elem in tree.iter():  #递归遍历所有子元素

    print elem.tag, elem.text, elem.attrib

 

 

 

c:\Python27\Scripts>python task_test.py

**************************************************

collection

{'shelf': 'New Arrivals'}

movie

    {'title': 'Enemy Behind'}

type War, Thriller {}

format DVD {}

year 2003 {}

rating PG {}

stars 10 {}

description Talk about a US-Japan war {}

movie

    {'title': 'Transformers'}

type Anime, Science Fiction {}

format DVD {}

year 1989 {}

rating R {}

stars 8 {}

description A schientific fiction {}

movie

    {'title': 'Trigun'}

type Anime, Action {}

format DVD {}

episodes 4 {}

rating PG {}

stars 10 {}

description Vash the Stampede! {}

movie

    {'title': 'Ishtar'}

type Comedy {}

format VHS {}

rating PG {}

stars 2 {}

description Viewable boredom {}

转载于:https://www.cnblogs.com/xiaxiaoxu/p/8656872.html

python 处理xml相关推荐

  1. python读取xml文件报错ValueError: multi-byte encodings are not supported

    1.在使用python对xml文件进行读取时,提示ValueError: multi-byte encodings are not supported 很多贴子上说把xml的编码格式改为,就可以正常执 ...

  2. python之XML文件解析

    python对XML的解析 常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同. python有三种方法解析XML,分别是SAX,DOM,以及ElementT ...

  3. python 解析xml

    在工作中很多时候都要用到xml,使用这个时候难免会设计到解析他,然后就研究了一下python解析xml问题,看了很多东西,python有很多解析xml的包,但是也折腾我好一段时间,最后选择了这个方法. ...

  4. 用python将xml文件转换为txt文件_python代码xml转txt实例

    为了训练深度学习模型,经常要整理大量的标注数据,需统一不同格式的标注数据,一般情况下习惯读取TXT格式的数据.但实际中经常遇到XML格式的标注数据,在此举例:1.读取XML标注数据:2.写入TXT文件 ...

  5. python读xml文件生成头文件_Python根据指定文件生成XML的方法

    因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看.其原始文件默认使用逗号进行分隔,如下所示: 第1个值:原始图片中切图小文件,以AIpng_x,其中x代表 ...

  6. xml python gb2312_使用Python处理XML格式数据的方法介绍

    本文实例讲述了Python处理XML格式数据的方法.分享给大家供大家参考,具体如下: 这里的操作是基于Python3平台. 在使用Python处理XML的问题上,首先遇到的是编码问题. Python并 ...

  7. python生成xml文件工具_Python根据指定文件生成XML的方法

    因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看.其原始文件默认使用逗号进行分隔,如下所示: 第1个值:原始图片中切图小文件,以AIpng_x,其中x代表 ...

  8. Python和xml简介

    python提供越来越多的技术来支持xml,本文旨在面向初学利用Python处理xml的读者,以教程的形式介绍一些基本的xml出来概念.前提是读者必须知道一些xml常用术语. 先决条件 本文所有的例子 ...

  9. python解析xml+得到pascal voc xml格式用于目标检测+美化xml

    1.python解析xml img_path='./data/001.tif'xml_path='./xml/001.xml'img=cv2.imread(img_path)# cv2.imshow( ...

  10. python 打印xml文档树_Python构建XML树结构的方法示例

    本文实例讲述了Python构建XML树结构的方法.分享给大家供大家参考,具体如下: 1.构建XML元素 #encoding=utf-8 from xml.etree import ElementTre ...

最新文章

  1. Quora Question Pairs 项目参考资料
  2. 关于c++变长参数列表总结
  3. python【力扣LeetCode算法题库】35- 搜索插入位置
  4. 四月读书主题整理——用尽费退,打磨身体
  5. codeforces 的一些数学题
  6. 注入点批量收集工具_原来微信群也是能够批量管理的,学到了
  7. text文字垂直居中_CSS垂直居中,你会多少种写法?
  8. SQL Server - 在SQL Server中创建ASSEMBLY
  9. 【报告分享】2021年空巢青年研究报告:静水流深,不将就的青春.pdf(附下载链接)...
  10. 转iPhone开发的门槛
  11. python中的深拷贝和浅拷贝
  12. Web服务器性能压力测试工具
  13. latex表格内容上下居中_Latex-表格内容垂直居中
  14. android contentprovider 生命周期,ContentProvider销毁/生命周期
  15. 大数据的核心价值是什么,主要表现在哪几方面?
  16. GDAL综合整理--7:GDAL实用工具简介
  17. Telegram附近的人功能存在安全风险,可被用于探测用户位置
  18. 数据模型|组成要素、概念模型、逻辑模型
  19. 蚂蚁课堂 - springboot入门(非常详细)讲解人:(余胜军)
  20. P2722 [USACO3.1]总分 Score Inflation

热门文章

  1. ajax2 cors跨域,Koa2框架应用CORS完成跨域ajax要求
  2. 服务器中的虚拟化是什么意思,虚拟化是什么意思
  3. 如何把“春节”这个主题写成万用的申论范文
  4. Istio:Mixer功能架构与实践
  5. [gdc17]《守望先锋》的EntityComponent架构
  6. 装修报价不担心被骗 避免家装陷阱报价揭密
  7. Java中的String的getBytes()方法
  8. 2012-7-05可樂词汇积累#9312;
  9. android smb同步,SMBsync安卓下最好的同步备份工具
  10. oracle vm 文件复制,Oracle VM VirtualBox虚拟机怎么实现与主机之间的文件拖动