各位用户为了找寻关于python中利用xml.dom模块解析xml的方法教程的资料费劲了很多周折。这里教程网为您整理了关于python中利用xml.dom模块解析xml的方法教程的相关资料,仅供查阅,以下为您介绍关于python中利用xml.dom模块解析xml的方法教程的详细内容
一、什么是xml?有何特征?
xml即可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
例子:del.xml
? 1 2 3 4 5 6 7 8 9 10 11 12 13<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
catalog
>
<
maxid
>4</
maxid
>
<
login
username
=
"pytest"
passwd
=
'123456'
>
<
caption
>Python</
caption
>
<
item
id
=
"4"
>
<
caption
>test</
caption
>
</
item
>
</
login
>
<
item
id
=
"2"
>
<
caption
>Zope</
caption
>
</
item
>
</
catalog
>
从结构上,很像HTML超文本标记语言。但他们被设计的目的是不同的,超文本标记语言被设计用来显示数据,其焦点是数据的外观。它被设计用来传输和存储数据,其焦点是数据的内容。
那么它有如下特征:
•它是有标签对组成, <aa></aa>
•标签可以有属性: <aa id='123'></aa>
•标签对可以嵌入数据: <aa>abc</aa>
•标签可以嵌入子标签(具有层级关系)
二、获得标签属性
? 1 2 3 4 5 6 7 8 9#coding: utf-8
import
xml.dom.minidom
dom
=
xml.dom.minidom.parse(
"del.xml"
)
#打开xml文档
root
=
dom.documentElement
#得到xml文档对象
print
"nodeName:"
, root.nodeName
#每一个结点都有它的nodeName,nodeValue,nodeType属性
print
"nodeValue:"
, root.nodeValue
#nodeValue是结点的值,只对文本结点有效
print
"nodeType:"
, root.nodeType
print
"ELEMENT_NODE:"
, root.ELEMENT_NODE
nodeType是结点的类型。catalog是ELEMENT_NODE类型
现在有以下几种:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23'ATTRIBUTE_NODE'
'CDATA_SECTION_NODE'
'COMMENT_NODE'
'DOCUMENT_FRAGMENT_NODE'
'DOCUMENT_NODE'
'DOCUMENT_TYPE_NODE'
'ELEMENT_NODE'
'ENTITY_NODE'
'ENTITY_REFERENCE_NODE'
'NOTATION_NODE'
'PROCESSING_INSTRUCTION_NODE'
'TEXT_NODE'
运行结果
? 1 2 3 4 5 6 7nodeName: catalog
nodeValue:
None
nodeType:
1
ELEMENT_NODE:
1
三、获得子标签
? 1 2 3 4 5 6 7 8 9 10 11#coding: utf-8
import
xml.dom.minidom
dom
=
xml.dom.minidom.parse(
"del.xml"
)
root
=
dom.documentElement
bb
=
root.getElementsByTagName(
'maxid'
)
print
type
(bb)
print
bb
b
=
bb[
0
]
print
b.nodeName
print
b.nodeValue
运行结果
? 1 2 3 4 5 6 7<
class
'xml.dom.minicompat.NodeList'
>
[<DOM Element: maxid at
0x2707a48
>]
maxid
None
四、获得标签属性值
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16#coding: utf-8
import
xml.dom.minidom
dom
=
xml.dom.minidom.parse(
"del.xml"
)
root
=
dom.documentElement
itemlist
=
root.getElementsByTagName(
'login'
)
item
=
itemlist[
0
]
print
item.getAttribute(
"username"
)
print
item.getAttribute(
"passwd"
)
itemlist
=
root.getElementsByTagName(
"item"
)
item
=
itemlist[
0
]
#通过在itemlist中的位置区分
print
item.getAttribute(
"id"
)
item2
=
itemlist[
1
]
#通过在itemlist中的位置区分
print
item2.getAttribute(
"id"
)
运行结果
? 1 2 3 4 5 6 7pytest
123456
4
2
五、获得标签对之间的数据
? 1 2 3 4 5 6 7 8 9 10 11 12#coding: utf-8
import
xml.dom.minidom
dom
=
xml.dom.minidom.parse(
"del.xml"
)
root
=
dom.documentElement
itemlist
=
root.getElementsByTagName(
'caption'
)
item
=
itemlist[
0
]
print
item.firstChild.data
item2
=
itemlist[
1
]
print
item2.firstChild.data
运行结果
? 1 2 3Python
test
六、例子
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39<?xml version
=
"1.0"
encoding
=
"UTF-8"
?>
<users>
<user
id
=
"1000001"
>
<username>Admin<
/
username>
<email>admin@live.cn<
/
email>
<age>
23
<
/
age>
<sex>boy<
/
sex>
<
/
user>
<user
id
=
"1000002"
>
<username>Admin2<
/
username>
<email>admin2@live.cn<
/
email>
<age>
22
<
/
age>
<sex>boy<
/
sex>
<
/
user>
<user
id
=
"1000003"
>
<username>Admin3<
/
username>
<email>admin3@live.cn<
/
email>
<age>
27
<
/
age>
<sex>boy<
/
sex>
<
/
user>
<user
id
=
"1000004"
>
<username>Admin4<
/
username>
<email>admin4@live.cn<
/
email>
<age>
25
<
/
age>
<sex>girl<
/
sex>
<
/
user>
<user
id
=
"1000005"
>
<username>Admin5<
/
username>
<email>admin5@live.cn<
/
email>
<age>
20
<
/
age>
<sex>boy<
/
sex>
<
/
user>
<user
id
=
"1000006"
>
<username>Admin6<
/
username>
<email>admin6@live.cn<
/
email>
<age>
23
<
/
age>
<sex>girl<
/
sex>
<
/
user>
<
/
users>
把name、email、age、sex输出
参考代码
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49# -*- coding:utf-8 -*-
from
xml.dom
import
minidom
def
get_attrvalue(node, attrname):
return
node.getAttribute(attrname)
if
node
else
''
def
get_nodevalue(node, index
=
0
):
return
node.childNodes[index].nodeValue
if
node
else
''
def
get_xmlnode(node, name):
return
node.getElementsByTagName(name)
if
node
else
[]
def
get_xml_data(filename
=
'user.xml'
):
doc
=
minidom.parse(filename)
root
=
doc.documentElement
user_nodes
=
get_xmlnode(root,
'user'
)
print
"user_nodes:"
, user_nodes
user_list
=
[]
for
node
in
user_nodes:
user_id
=
get_attrvalue(node,
'id'
)
node_name
=
get_xmlnode(node,
'username'
)
node_email
=
get_xmlnode(node,
'email'
)
node_age
=
get_xmlnode(node,
'age'
)
node_sex
=
get_xmlnode(node,
'sex'
)
user_name
=
get_nodevalue(node_name[
0
])
user_email
=
get_nodevalue(node_email[
0
])
user_age
=
int
(get_nodevalue(node_age[
0
]))
user_sex
=
get_nodevalue(node_sex[
0
])
user
=
{}
user[
'id'
] , user[
'username'
] , user[
'email'
] , user[
'age'
] , user[
'sex'
]
=
(
int
(user_id), user_name , user_email , user_age , user_sex
)
user_list.append(user)
return
user_list
def
test_load_xml():
user_list
=
get_xml_data()
for
user
in
user_list :
print
'-----------------------------------------------------'
if
user:
user_str
=
'No.:t%dnname:t%snsex:t%snage:t%snEmail:t%s'
%
(
int
(user[
'id'
]) , user[
'username'
], user[
'sex'
] , user[
'age'
] , user[
'email'
])
print
user_str
if
__name__
=
=
"__main__"
:
test_load_xml()
结果
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79C:Userswzh94434Desktopxml>python user.py
user_nodes: [<DOM Element: user at
0x2758c48
>, <DOM Element: user at
0x2756288
>,
<DOM Element: user at
0x2756888
>, <DOM Element: user at
0x2756e88
>, <DOM Elemen
t: user at
0x275e4c8
>, <DOM Element: user at
0x275eac8
>]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
No.:
1000001
name: Admin
sex: boy
age:
23
Email: admin@live.cn
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
No.:
1000002
name: Admin2
sex: boy
age:
22
Email: admin2@live.cn
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
No.:
1000003
name: Admin3
sex: boy
age:
27
Email: admin3@live.cn
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
No.:
1000004
name: Admin4
sex: gril
age:
25
Email: admin4@live.cn
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
No.:
1000005
name: Admin5
sex: boy
age:
20
Email: admin5@live.cn
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
No.:
1000006
name: Admin6
sex: gril
age:
23
Email: admin6@live.cn
七、总结
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55minidom.parse(filename)
加载读取XML文件
doc.documentElement
获取XML文档对象
node.getAttribute(AttributeName)
获取XML节点属性值
node.getElementsByTagName(TagName)
获取XML节点对象集合
node.childNodes #返回子节点列表。
node.childNodes[index].nodeValue
获取XML节点值
node.firstChild
#访问第一个节点。等价于pagexml.childNodes[0]
doc = minidom.parse(filename)
doc.toxml('UTF-8')
返回Node节点的xml表示的文本
Node.attributes["id"]
a.name #就是上面的 "id"
a.value #属性的值
访问元素属性
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://www.cnblogs.com/kaituorensheng/p/4493306.html