ElementTree处理简单XML

# -*- coding:gb2312 -*-
import os
# 最好使用C实现的哪种,速度快,消耗内存少
try:
    import xml.etree.cElementTree as ET # use
except ImportError:
    import xml.etree.ElementTree as ET

g_path_XML = '../../XML/'

class XmlTest(object):
    def __init__(self):
        self.tree = None #(树)
        self.root = None # 根节点,root是一个Element元素

    # 从创建文件夹->xml->tree
    def startSetPath(self, s_dir=None):
        '''
        更新XML存放路径,并开始新的存放记录
        参数:
            s_dir: 具体到路径
        '''
        if s_dir:
            global g_path_XML
            g_path_XML = os.path.abspath(s_dir)
        else:
            g_path_XML = os.path.abspath(g_path_XML)
        # 如果文件夹存在,则根据文件夹数量新建,+1.xml
        if os.path.exists(g_path_XML):
            g_path_XML = os.path.join(g_path_XML, str(len(os.listdir(g_path_XML))+1)+'.xml')
        # 第一次肯定新建文件夹,包含'1.xml'
        else:
            os.mkdir(g_path_XML)
            g_path_XML = os.path.join(g_path_XML, '1.xml')
        self.tree = ET.ElementTree()       #
        self.root = ET.Element('root')    # 新创建一个元素,根节点,root是一个Element元素
        self.tree._setroot(self.root)           # def _setroot(self, element): 注意:参数element是一个元素


    # 获取XML内容
    def getXmlContent(self, s_file=None):
        '''
    参数:
        s_file: 具体到某个文件
    '''
        if s_file:
            global g_path_XML
            g_path_XML = os.path.abspath(s_file)
        else:
            g_path_XML = os.path.join(os.path.abspath(g_path_XML), '1.xml')
        if os.path.exists(g_path_XML):
            # tree = ET.ElementTree('root', g_path_XML)
            # ElementTree 有两个paramer, 第一个是根节点,第二个是需解析的xml文件
            # 加载并解析这个XML,形成一个tree(树)
            self.tree = ET.ElementTree(file=g_path_XML)
            self.root = self.tree.getroot()
            # ET.dump(tree)
        else:
            print "路径%s不存在" % g_path_XML

    def writeXml(self):
        # tree.write(sys.stdout) # 写入缓存
        self.tree.write(g_path_XML, 'UTF-8') # 写入XML

    # 删除XML节点
    def delXmlNode(self):
        for child_of_root in self.tree.iter(tag='Basic'):
            # del child_of_root[4]  # 删除节点
            # set可以修改和增加元素中的(字典中的值)
            child_of_root[0].set('xionda', '888')
            child_of_root[0].set('Value', '111')

    # 增加新XML节点
    def addNewXmlNode(self):
        # 增加  <My><Person Age="24" Name="liuyc" Sex="1" /></My>
        a = ET.SubElement(self.root, 'My')
        b = ET.SubElement(a, 'Person')
        b.set('Name', 'liuyc')
        b.set('Sex', 'man')
        b.set('Age', '24')

    def creatNewTree(self):
        '''
           新建一棵树
           <new_root><elem_a><child01>c: some thing</child01><child02 /></elem_a><elem_b>b: some text</elem_b></new_root>
       '''
        a = ET.Element('elem_a')            # 新建一个树的节点a
        c = ET.SubElement(a, 'child01')     # a点增加一个新节点
        c.text = 'c: some thing'           # c节点中间增加文体
        d = ET.SubElement(a, 'child02')     # a增加第二个节点
        b = ET.Element('elem_b')            # 新建和a同级的节点
        b.text = 'b: some text'
        new_root = ET.Element('new_root')
        new_root.extend((a, b))              # (a,b)合并到new_root树节点
        new_tree = ET.ElementTree(new_root)  # 增加一颗树
        ET.dump(new_tree)

    def printXml(self):
        print '----------print_xml-----------'
        i_num = 0
        for child_of_root in self.tree.iter():
            i_num += 1
            print child_of_root.tag, child_of_root.attrib
            # print "[%s] (Name=%s) (Type=%s) (Value=%s)" % \
            #        (i_num, child_of_root.attrib['Name'], child_of_root.attrib['Type'], child_of_root.attrib['Value'])


if __name__ == "__main__":
    o_xml_test = XmlTest()
    o_xml_test.startSetPath(r'D:\note\Test\DEAL_XML\MY_TEST\test_xml')
    o_xml_test.addNewXmlNode()
    o_xml_test.writeXml()
    o_xml_test.printXml()

    o_xml_test.getXmlContent(r'D:\note\Test\DEAL_XML\MY_TEST\test_xml\1.xml')
    o_xml_test.printXml()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值