一、写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并不对文本字符进行检查,象文本中如果出现了'<','&'之类的字符,应该转换为相应的实体符号'<','&'才可以,这里没有做这个处理。
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并不真正进行编码的处理,如果你保存的文本内容中有汉字,则需要自已进行编码转换。
示例:
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编码。
输出:
-
<?xml version= "1.0" ?>
-
<people>
-
<person>
-
<name>Annie</name>
-
</person>
-
</people>
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. 取得元素下文本结点的内容
>>> 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