您的位置:首页 > 其它

ElementTree处理简单XML

2016-01-18 14:28 274 查看
# -*- 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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml ElementTree