由于工作原理因需要把一个xml的某几个节点写入另一个xml中,在网上坐了大半天还是没有找到合适的代码(PS:由于本人比较懒,没找到直接可以用的代码:-),于是找了Python的一些xml包,自己写的读xml文件,并插入到另一个xml文件中,源码就不贴了,现把用到的函数整理如下,以便以后使用。
整理的这些基本上可以较全面的对xml增删改查操作了(欢迎网友补充).
所有get返回的节点类型全部为list!
所有get返回的节点类型全部为list!
所有get返回的节点类型全部为list!
import codecs
from xml.dom import minidom #python 里这个应该是叫包
1、读xml
xml会递归读取当前节点下所有的同名节点
<id>
<age>66</age>
<name>
<age>66</age>
</name>
</id>
如果get<id>节点下的age那么<name>节点下的age也会被get到
1. 加载xml文件
dom = minidom.parse(file)
2. 获取根节点
root = dom.documentElement
3. 节点列表 每一个节点列表都可用该接口获得
nodes = root.getElementsByTagName(nodeName) ⇒ <nodeName></nodeName>
4. 节点属性 每一个节点属性都可用该接口获得
attr = node.getAttribute(attrname) ⇒ <NODE attrname=attr>
content = node.firstChild.data // 元素节点的文本内容 ⇒ <NODE> this is data </NODE>
5. 打印节点内容
node.toxml() //此输出未格式化
node.toprettyxml() //格式化输出
第4步会获得儿子节点,孙子节点,曾孙节点等等等等所有当前节点下所有的同名节点
2、写xml
1. 创建DOM树对象:
dom = minidom.Document()
2. 创建根节点。 ==> 用DOM可创建任何节点,但第一个创建的节点一定是根节点
rootNode = dom.createElement(rootName)<rootName></rootName>
3. 添加节点
dom.appendChild(rootNode) //添加根节点 任何节点都用appendChild() 添加
4. 设置节点属性
node.setAttribute(key, value) ⇒ <NODE key=value></NODE>
5. 创建文本节点
node.createTextNode(content) // 可用于创建任何节点的文本 ==> <NODE>content</NODE>
创建后需添加到节点下
nodes.appendChild(node) // nodes为上级节点
6. 写入文件
f = codecs.open('1.xml','w','utf-8')
dom.writexml(f,addindent=' ',newl='\n',encoding = 'utf-8') //格式控制 缩进-换行-编码
简单来说就是:
Node = dom.createElement("node") # 创建xml节点
Node.setAttribute(key, value) # 设置xml节点属性
Value = dom.createTextNode("txt") # 创建文本节点
Node.appendChild(Value) # 把文本节点挂到xml节点
addNode.appendChild(Node) # 把xml节点挂到需要写入的节点下
由于自带的writexml函数写入文件后格式太丑 故在网上找到了重写的writexml。使用的时候直接扔.py里边就行
(这段是在网上down的,如侵删)
def fixed_writexml(self, writer, indent="", addindent="", newl=""):
# indent = current indentation
# addindent = indentation to add to higher levels
# newl = newline string
writer.write(indent+"<" + self.tagName)
attrs = self._get_attributes()
a_names = attrs.keys()
a_names.sort()
for a_name in a_names:
writer.write(" %s=\"" % a_name)
minidom._write_data(writer, attrs[a_name].value)
writer.write("\"")
if self.childNodes:
if len(self.childNodes) == 1 \
and self.childNodes[0].nodeType == minidom.Node.TEXT_NODE:
writer.write(">")
self.childNodes[0].writexml(writer, "", "", "")
writer.write("</%s>%s" % (self.tagName, newl))
return
writer.write(">%s"%(newl))
for node in self.childNodes:
if node.nodeType is not minidom.Node.TEXT_NODE:
node.writexml(writer,indent+addindent,addindent,newl)
writer.write("%s</%s>%s" % (indent,self.tagName,newl))
else:
writer.write("/>%s"%(newl))
minidom.Element.writexml = fixed_writexml