Python_Xml简介

Xml简介

1、说明:

 

<?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>

>>> from xml.dom.minidom import parse
>>> #minidom解析器打开xml文档并将其解析为内存中的一棵树
... DOMTree = parse(r"E:\756271310\FileRecv\book.xml")
>>> #获取xml文档对象,就是拿到树的根
... booklist = DOMTree.documentElement
>>>
>>> for book in booklist.getElementsByTagName("book"):
...     print ("本书的分类是:%s" %book.getAttribute("category"))
...     for element in ["title","author","pageNumber"]:
...         name = book.getElementsByTagName(element)[0].tagName
...         name_value = book.getElementsByTagName(element)[0].childNodes[0].data
...         print(name,":",name_value)
...

本书的分类是:math

title : learning math

author : 张三

pageNumber : 561

本书的分类是:Python

title : learning Python

author : 李四

pageNumber : 600

>>> print("*"*50)

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

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

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

4、XML标签对大小写敏感;比如: 下面是两个不同的标签

2DOM的解析

 

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

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

(1)获取根元素

booklist = DOMTree.documentElement#自动获取根元素
print(booklist)

(2)找到所有元素

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

 

(3)判断根目录是否有属性type

if booklist.hasAttribute("type"):
  #判断根节点booklist是否有type属性
  print(u"booklist元素存在type属性")
else :
  print(u"booklist元素不存在type属性") 

(4)获取属性值

if booklist.hasAttribute("type") : 
  #判断根节点booklist是否有type属性,有则获取并打印属性的值
  print("Root element is", booklist.getAttribute("type"))

 

(5)所有book的节点的list集合

books = booklist.getElementsByTagName("book")

print(type(books))

print (books)

(6)获取节点的属性值

>>> books[1].getAttribute("category")

'Python'

(7)获取所有子节点

books = booklist.getElementsByTagName("book")

print(books[0].childNodes)

(8)获取文本节点的值

是author的下一级节点

>>> books[0].childNodes[3].childNodes[0].data
'张三'

 

>>> books[1].childNodes[3].childNodes[0].data
'李四'

(9)获取标签名称

>>> books[1].childNodes[3].tagName#Name大写

'author'

(10)练习一:

把所有书的分类属性输出一下

把所有书的具体信息输出一下:名字、作者和书的页数

 

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

for book in booklist.getElementsByTagName("book"):
    print ("本书的分类是:%s" %book.getAttribute("category"))
    name = book.getElementsByTagName("title")[0].tagName
    name_value = book.getElementsByTagName("title")[0].childNodes[0].data
    print(name,":",name_value)
    author = book.getElementsByTagName("author")[0].tagName
    author_value = book.getElementsByTagName("author")[0].childNodes[0].data
    print(author,":",author_value)
    page_number = book.getElementsByTagName("pageNumber")[0].tagName
    page_number_value = book.getElementsByTagName("pageNumber")[0].childNodes[0].data
    print(page_number,":",page_number_value)
    print("*"*50)

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

 (11)练习二

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

for book in booklist.getElementsByTagName("book"):
    print ("本书的分类是:%s" %book.getAttribute("category"))
    for element in ["title","author","pageNumber"]:
        name = book.getElementsByTagName(element)[0].tagName
        name_value = book.getElementsByTagName(element)[0].childNodes[0].data
        print(name,":",name_value)

print("*"*50)
****************************************************

(12)判断是否有子节点

#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

#获取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"不存在叶子节点")

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

(13)判断是否有文本节点/Element节点

>>> isinstance(books[0].childNodes[0],xml.dom.minidom.Text)
True
>>> isinstance(books[0].childNodes[1],xml.dom.minidom.Element)
True 

(14)创建文档

#coding=utf-8
import xml.dom.minidom
#在内存中创建一个空的文档
doc = xml.dom.minidom.Document()
print(doc)

(15)创建根元素 

1)设置根元素的属性

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

>>> value = root.getAttribute('company')

>>> value

'xx科技'

2)设置多个属性

>>> root.setAttribute('name', 'gloryroad科技')

>>> value = root.getAttribute('name')

>>> value

'gloryroad科技'

(16)添加文本节点

#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('吴总'))
print(ceo.tagName)
print(u"给叶子节点添加文本节点成功")

(17)某一节点下的xml打印

print(ceo.toxml())

(18)添加子节点

#encoding=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())

(19)写到文件里

#encoding=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)

fp = codecs.open('e:\\company.xml', 'w','utf-8')
doc.writexml(fp, indent='', addindent='\t', newl='\n', encoding="utf-8")
fp.close()

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

(20)open的方式打开文件

#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('e:\\company.xml', 'w',encoding='utf-8')
doc.writexml(fp, indent='', addindent='\t', newl='\n', encoding="utf-8")
fp.close()
posted @ 2019-07-21 22:20  翻滚的小强  阅读(194)  评论(0编辑  收藏  举报