【Python】xml 解析

时间:2021-10-26 18:57:39

1、 XML:指可扩展标记语言,是一种标记语言,用于存储数据和传输数据,但没有像HTML那样具有预定义标签,需要程序猿自定义标签

2、 XML的解析:读取XML数据结构中的某些信息,比如读取书的属性

3、 XML注释格式为:

<!—注释内容-->

4、 CDATA指不应由XML解析器进行解析的文本数据

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

5、 Python解析XML的是三种方法

(1) SAX 逐行解析

(2) DOM 对象,一次性读取全部,将内存存储到内存中,将XML存成一棵树

(3) ElementTree

6、 Doc.toxml() 获取xml文档函数,也就是文档内容

7、 xml.dom解析xml常用api

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

 
 【Python】xml 解析

【Python】xml 解析

8、 node.hasAttribute()判断属性在不在

9、 node.hasAttribute()获取节点的某个属性值

10、 doc.documentElement获取xml文档对象,就是拿到DOM树的根

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

12、 hasChildNodes()判断是否存在叶子结点

 【Python】xml 解析

13、 node.childNodes返回节点node下所有子节点组成的list

 【Python】xml 解析

节点:0,2,4,6是回车文本节点;1,3,5是标签节点

 
 【Python】xml 解析

【Python】xml 解析

 
#练习:自定义一个xml文件,包含数据库的ip地址,用户名、密码和数据库名称,将它从xml中读取出来,放到一个List里面
from xml.dom.minidom import parse
 
domtree=parse("e:\ip.xml")
 
treelist=domtree.documentElement
ipaddress=treelist.getElementsByTagName("ip")
 
lst=[]
for i in range(1,6,2):
    tag_name=ipaddress[0].childNodes[i].tagName
    tag_content=ipaddress[0].childNodes[i].childNodes[0].data
    lst.append(tag_name+":"+tag_content)
print lst
for i in lst:
    print i
 
 
#练习:xml解析
#从xml.dom.minidom模块引入解析器parse
from xml.dom.minidom import parse
 
#minidom解析器打开xml文档并将其解析为内存中的一棵树
DOMTree = parse(r"e:\test.xml")
print type(DOMTree) #instance对象
 
#获取xml文档对象,就是拿到树的根
booklist = DOMTree.documentElement  #DOM对象
print u"DOM树的根对象:",booklist
 
if booklist.hasAttribute("type") :
  #判断根节点booklist是否有type属性
  print u"booklist元素存在type属性"
else :
  print u"booklist元素不存在type属性"
 
if booklist.hasAttribute("type") :
   #判断根节点booklist是否有type属性,有则获取并打印属性的值
  print "Root element is", booklist.getAttribute("type")
print type(booklist.getAttribute("type"))
 
print u"xml文档内容:\n%s" %DOMTree.toxml()
 
#获取booklist对象中所有book节点的list集合
books = booklist.getElementsByTagName("book")
print type(books)
print books
 
print "*"*30
 
#获取booklist对象中所有author节点的list集合
author=booklist.getElementsByTagName("author")
print author
 
print "*"*30
 
#获取所有子节点
print books[0].childNodes
 
print "*"*30
 
#获取节点名称和文本放到一个字典中
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
 
print "*"*30
 
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"不存在叶子节点"
 
print "*"*30
 
#练习:xml解析
from xml.dom.minidom import parse
import xml.dom.minidom
# 使用minidom解析器打开 XML 文档
DOMTree = xml.dom.minidom.parse(r"e:\\movie.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] #[0]表示第一个title标签,因为一个<book>...</book>之间可能会
                                                 #定义多个title标签
    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