使用xml.dom的minidom模块读写xml

时间:2022-08-24 22:39:06

由于工作原理因需要把一个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