python之minidom读写xml

一、写xml文件

1.生成dom对象

>>> import xml.dom.minidom
>>> impl = xml.dom.minidom.getDOMImplementation()
>>> dom = impl.createDocument(None, 'catalog', None)
>>> root = dom.documentElement
或
from xml.dom import minidom
# 生成XML文件方式
impl = minidom.getDOMImplementation()

# 创建一个xml dom
# 三个参数分别对应为 :namespaceURI, qualifiedName, doctype
doc = impl.createDocument(None, None, None)
# 创建根元素
rootElement = doc.createElement('Pythons')
这样就生成了一个空的dom对象。其中catalog为文档元素名,即根元素名。

或者

#导入minidom
from xml.dom import minidom

# 1.创建DOM树对象
dom=minidom.Document()
# 2.创建根节点。每次都要用DOM对象来创建任何节点。
root_node=dom.createElement('root')
# 3.用DOM对象添加根节点
 dom.appendChild(root_node)

2、生成各种结点对象

dom对象拥有各种生成结点的方法,下面列出文本结点,CDATA结点和元素结点的生成过程。

1. 文本结点的生成

>>> text=dom.createTextNode('test')
test

要注意的是,在生成结点时,minidom并不对文本字符进行检查,象文本中如果出现了'<','&'之类的字符,应该转换为相应的实体符号'&lt;','&amp;'才可以,这里没有做这个处理。

2. CDATA结点的生成

>>> data = dom.createCDATASection('aaaaaa\nbbbbbb')
>>> data.toxml()
'<![CDATA[aaaaaa\nbbbbbb]]>'

CDATA是用于包括大块文本,同时可以不用转换'<','&'字符的标记,它是用<![CDATA[文本]]>来包括的。但文本中不可以有"]]>"这样的串存在。生成结点时minidom不作这些检查,只有当你输出时才有可能发现有错。

3. 元素结点的生成

>>> item = dom.createElement_x_x_x_x_x('caption')
>>> item.toxml()
'<caption/>'

对于象元素这样的结点,生成的元素结点其实是一个空元素,即不包含任何文本.

3.写入到XML文件中

dom对象树已经生成好了,我们可以调用dom的writexml()方法来将内容写入文件中。writexml()方法语法格式为:

writexml(writer, indent, addindent, newl, encoding)

  • writer是文件对象
  • indent是每个tag前填充的字符,如:' ',则表示每个tag前有两个空格
  • addindent是每个子结点的缩近字符
  • newl是每个tag后填充的字符,如:'\n',则表示每个tag后面有一个回车
  • encoding是生成的XML信息头中的encoding属性值,在输出时minidom并不真正进行编码的处理,如果你保存的文本内容中有汉字,则需要自已进行编码转换。
writexml方法是除了writer参数必须要有外,其余可以省略。

示例:

from xml.dom.minidom import Document

doc = Document()

people = doc.createElement("people")

doc.appendChild(people)

aperson = doc.createElement("person")

people.appendChild(aperson)

name = doc.createElement("name")

aperson.appendChild(name)

personname = doc.createTextNode("Annie")

name.appendChild(personname)

filename = "people.xml"

f = open(filename, "w")

f.write(doc.toprettyxml(indent=" "))

f.close()

>>> f=file('d:/test.xml', 'w')
>>> import codecs
>>> writer = codecs.lookup('utf-8')[3](f)
>>> dom.writexml(writer, encoding='utf-8')
>>> writer.close()


生成UTF-8编码的写入流对象,这样在保存时会自动将Unicode转换成UTF-8编码。

输出:

  1. <?xml version= "1.0" ?>
  2. <people>
  3. <person>
  4. <name>Annie</name>
  5. </person>
  6. </people>
二、读xml

xml.dom.minidom 模块被用来处理xml文件

parse():用于打开一个xml文件

documentElement:用于得到dom对象的文档元素,并将获得的对象给root,每一个结点都有它的nodeName,nodeValue,nodeType属性

nodeName:结点名字

nodeValue:结点值,只对文本结点有效

nodeType:结点类型

读取过程:

1. 导入xml.dom.minidom模块,生成dom对象
2. 得到文档对象(根对象)
3. 通过getElementsByTagName_r()方法和childNodes属性(还有其它一些方法和属性)找到要处理的元素
4. 取得元素下文本结点的内容

1.得到dom对象

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

这样我们得到了一个dom对象。

2、得到文档元素对象

>>> root = dom.documentElement

这样我们得到了根元素。

3.访问子元素、子结点的方法很多,对于知道元素名字的子元素,可以使用getElementsByTagName方法,如读取maxid子元素:

>>> root.getElementsByTagName_r('maxid')

[<DOM Element: maxid at 0xb6d0a8>]

这样返回一个列表,

getElementsByTagName可以搜索当前元素的所有子元素,包括所有层次的子元素。childNodes只保存了当前元素的第一层子结点。

4.获取标签数据

print element.data

5.获取属性

root.getAttribute("username")

主要方法:

minidom.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]


示例:

from xml.dom import minidom
  doc 
= minidom.parse("employees.xml")
  
  
# get root element: <employees/>
  root = doc.documentElement
  
  
# get all children elements: <employee/> <employee/>
  employees = root.getElementsByTagName("employee")

参考:

https://blog.csdn.net/linking530/article/details/8022110

https://www.cnblogs.com/cmt110/p/7464944.html

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值