6-4 如何构建xml文档

 

>>> from xml.etree.ElementTree import Element,ElementTree

Element 是节点元素

ElementTree是由 Element 组成

1、创建一个元素

>>> e = Element("Data")   #创建一个元素,传入一个字符串 <Data>是head的名字
>>> e.set('name','abc')   #设备这个元素的属性,get获取属性,set设置属性。属性为’name’值 是abc
>>> help(Element.set)
Help on method set in module xml.etree.ElementTree:

set(self, key, value) unbound xml.etree.ElementTree.Element method
help(Element.set)
>>> from xml.etree.ElementTree import tostring #显示成为XML元素后转成了字符串
>>> tostring(e)
'<Data name="abc" />'

#XML元素的所有内容都应该是字符串不应该是其他的数据类型

>>> e.text = 123
>>> tostring(e)

Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    tostring(e)
  File "C:\Python27\lib\xml\etree\ElementTree.py", line 1126, in tostring
    ElementTree(element).write(file, encoding, method=method)
  File "C:\Python27\lib\xml\etree\ElementTree.py", line 820, in write
    serialize(write, self._root, encoding, qnames, namespaces)
  File "C:\Python27\lib\xml\etree\ElementTree.py", line 937, in _serialize_xml
    write(_escape_cdata(text, encoding))
  File "C:\Python27\lib\xml\etree\ElementTree.py", line 1075, in _escape_cdata
    _raise_serialization_error(text)
  File "C:\Python27\lib\xml\etree\ElementTree.py", line 1052, in _raise_serialization_error
    "cannot serialize %r (type %s)" % (text, type(text).__name__)
TypeError: cannot serialize 123 (type int)
>>> e.text = '123'
>>> tostring(e)
'<Data name="abc">123</Data>'

2、给一个元素添加子元素

>>> e2 = Element('Row')          #创建一个元素
>>> e3 = Element('Open')
>>> e3.text = '8.80'
>>> e2.append(e3)        #将e3添加到e2成为其子元素
>>> tostring(e2)
'<Row><Open>8.80</Open></Row>'
>>> help(Element.append)
Help on method append in module xml.etree.ElementTree:

append(self, element) unbound xml.etree.ElementTree.Element method
help(Element.append)

#将一个已赋值的元素属性删除的方法

>>> e.text
'123'
>>> e.text = None
>>> tostring(e)
'<Data name="abc" />'

>>> e.append(e2)
>>> tostring(e)
'<Data name="abc"><Row><Open>8.80</Open></Row></Data>'

3、XML格式的字符串写入文件中

(1)创建一个ElementTree

>>> et = ElementTree(e)
>>> et
<xml.etree.ElementTree.ElementTree object at 0x027166B0>

(2)使用ElementTree对象的write方法

>>> et.write(r"C:\视频\python高效实践技巧笔记\6数据编码与处理相关话题\6-4.xml")

 

例: 将6-1中的csv文件 bank-databak.csv 转为xml文件,脚本文件为

import csv
from xml.etree.ElementTree import Element, ElementTree
“””
美化xml文件用,也就是使输出的xml文件有一个合理的缩进格式
“””
def pretty(e,level = 0):
    if(len(e)>0):
        e.text = '\n' + '\t' * (level+1)
        for child in e:
            pretty(child,level+1)
        child.tail = child.tail[:-1]
    e.tail = '\n' +'\t'*level

“”“
CSV文件转XML文件,参数是CSV文件的路径
”“”
def CsvToXml(fname):
    with open(fname) as f:        #打开CSV文件
        reader = csv.reader(f)        #读取CSV文件
        head = reader.next()        #获取CSV文件的头

        root = Element('Data')        #创建XML的一个元素作为根节点

        for row in reader:        #对CSV的头进行迭代
            eRow = Element('Row')    ##创建一个元素Row
            root.append(eRow)        #将此Row元素添加到root中,作为子节点
            for tag,text  in zip(head,row): 同时迭代CSV文件的头的每一项和每一行的每一项
                e = Element(tag)     #将CSV头的项作为XML文件的一个元素
                e.text = text        #将CSV文件中的每一行的每一项的内容做为XML每一个元素的值。
                eRow.append(e)      #将此e的元素添加到Row中作为子节点
    pretty(root)            #美化XML文件
    return ElementTree(root)        #返回一个EleMentTree对象

#调用转化函数,返回一个ElementTree对象
et = CsvToXml(r'C:\视频\python高效实践技巧笔记\6数据编码与处理相关话题\bank-databak.csv')

#将返回的ElementTree对象写入文件中
et.write(r'C:\视频\python高效实践技巧笔记\6数据编码与处理相关话题\bank-databak.xml')

 

结果:

 

 

 

posted on 2018-04-28 13:11  石中玉smulngy  阅读(338)  评论(0)    收藏  举报

导航