在Python中以XML为结构的数据库中数据结构都有哪些?

转载:http://www.jb51.net/article/79494.htm
这篇文章主要为大家详细介绍了深入解读Python解析XML的几种方式,以ElementTree模块为例,演示具体使用方法和场景,感兴趣的小伙伴们可以参考一下
在XML解析方面,Python贯彻了自己“开箱即用”(batteries included)的原则。在自带的标准库中,Python提供了大量可以用于处理XML语言的包和工具,数量之多,甚至让Python编程新手无从选择。
本文将介绍深入解读利用Python语言解析XML文件的几种方式,并以笔者推荐使用的ElementTree模块为例,演示具体使用方法和场景。文中所使用的Python版本为2.7。
一、什么是XML?
XML是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分。您可以创建内容,然后使用限定标记标记它,从而使每个单词、短语或块成为可识别、可分类的信息。
标记语言从早期的私有公司和政府制定形式逐渐演变成标准通用标记语言(Standard Generalized Markup Language,SGML)、超文本标记语言(Hypertext Markup Language,HTML),并且最终演变成 XML。XML有以下几个特点。
XML的设计宗旨是传输数据,而非显示数据。
XML标签没有被预定义。您需要自行定义标签。
XML被设计为具有自我描述性。
XML是W3C的推荐标准。
目前,XML在Web中起到的作用不会亚于一直作为Web基石的HTML。 XML无所不在。XML是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。因此,学会如何解析XML文件,对于Web开发来说是十分重要的。
二、有哪些可以解析XML的Python包?
Python的标准库中,提供了6种可以用于处理XML的包。
xml.dom实现的是W3C制定的DOM API。如果你习惯于使用DOM API或者有人要求这这样做,可以使用这个包。不过要注意,在这个包中,还提供了几个不同的模块,各自的性能有所区别。
DOM解析器在任何处理开始之前,必须把基于XML文件生成的树状数据放在内存,所以DOM解析器的内存使用量完全根据输入资料的大小。
xml.dom.minidom
xml.dom.minidom是DOM API的极简化实现,比完整版的DOM要简单的多,而且这个包也小的多。那些不熟悉DOM的朋友,应该考虑使用xml.etree.ElementTree模块。据lxml的作者评价,这个模块使用起来并不方便,效率也不高,而且还容易出现问题。
xml.dom.pulldom
与其他模块不同,xml.dom.pulldom模块提供的是一个“pull解析器”,其背后的基本概念指的是从XML流中pull事件,然后进行处理。虽然与SAX一样采用事件驱动模型(event-driven processing model),但是不同的是,使用pull解析器时,使用者需要明确地从XML流中pull事件,并对这些事件遍历处理,直到处理完成或者出现错误。
pull解析(pull parsing)是近来兴起的一种XML处理趋势。此前诸如SAX和DOM这些流行的XML解析框架,都是push-based,也就是说对解析工作的控制权,掌握在解析器的手中。
xml.sax模块实现的是SAX API,这个模块牺牲了便捷性来换取速度和内存占用。SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准。它是事件驱动的,并不需要一次性读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。
xml.parser.expat
xml.parser.expat提供了对C语言编写的expat解析器的一个直接的、底层API接口。expat接口与SAX类似,也是基于事件回调机制,但是这个接口并不是标准化的,只适用于expat库。
expat是一个面向流的解析器。您注册的解析器回调(或handler)功能,然后开始搜索它的文档。当解析器识别该文件的指定的位置,它会调用该部分相应的处理程序(如果您已经注册的一个)。该文件被输送到解析器,会被分割成多个片断,并分段装到内存中。因此expat可以解析那些巨大的文件。
xml.etree.ElementTree(以下简称ET)
xml.etree.ElementTree模块提供了一个轻量级、Pythonic的API,同时还有一个高效的C语言实现,即xml.etree.cElementTree。与DOM相比,ET的速度更快,API使用更直接、方便。与SAX相比,ET.iterparse函数同样提供了按需解析的功能,不会一次性在内存中读入整个文档。ET的性能与SAX模块大致相仿,但是它的API更加高层次,用户使用起来更加便捷。
笔者建议,在使用Python进行XML解析时,首选使用ET模块,除非你有其他特别的需求,可能需要另外的模块来满足。
解析XML的这几种API并不是Python独创的,Python也是通过借鉴其他语言或者直接从其他语言引入进来的。例如expat就是一个用C语言开发的、用来解析XML文档的开发库。而SAX最初是由DavidMegginson采用java语言开发的,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构,可以应用于任何编程语言。
下面,我们以ElementTree模块为例,介绍在Python中如何解析lxml。
三、利用ElementTree解析XML
Python标准库中,提供了ET的两种实现。一个是纯Python实现的xml.etree.ElementTree,另一个是速度更快的C语言实现xml.etree.cElementTree。请记住始终使用C语言实现,因为它的速度要快很多,而且内存消耗也要少很多。如果你所使用的Python版本中没有cElementTree所需的加速模块,你可以这样导入模块:
&&import xml.etree.cElementTree as ET
except ImportError:
&&import xml.etree.ElementTree as ET
如果某个API存在不同的实现,上面是常见的导入方式。当然,很可能你直接导入第一个模块时,并不会出现问题。请注意,自Python 3.3之后,就不用采用上面的导入方法,因为ElemenTree模块会自动优先使用C加速器,如果不存在C实现,则会使用Python实现。因此,使用Python 3.3+的朋友,只需要import xml.etree.ElementTree即可。
1、将XML文档解析为树(tree)
我们先从基础讲起。XML是一种结构化、层级化的数据格式,最适合体现XML的数据结构就是树。ET提供了两个对象:ElementTree将整个XML文档转化为树,Element则代表着树上的单个节点。对整个XML文档的交互(读取,写入,查找需要的元素),一般是在ElementTree层面进行的。对单个XML元素及其子元素,则是在Element层面进行的。下面我们举例介绍主要使用方法。
我们使用下面的XML文档,作为演示数据:
&?xml version="1.0"?&
&&&branch name="codingpy.com" hash="1cdf045c"&
&&&&text,source
&&&/branch&
&&&branch name="release01" hash="f200013e"&
&&&&&sub-branch name="subrelease01"&
&&&&&&xml,sgml
&&&&&/sub-branch&
&&&/branch&
&&&branch name="invalid"&
&&&/branch&
接下来,我们加载这个文档,并进行解析:
&&& import xml.etree.ElementTree as ET
&&& tree = ET.ElementTree(file='doc1.xml')
然后,我们获取根元素(root element):
&&& tree.getroot()
&Element 'doc' at 0x11eb780&
正如之前所讲的,根元素(root)是一个Element对象。我们看看根元素都有哪些属性:
&&& root = tree.getroot()
&&& root.tag, root.attrib
('doc', {})
没错,根元素并没有属性。与其他Element对象一样,根元素也具备遍历其直接子元素的接口:
&&& for child_of_root in root:
...& print child_of_root.tag, child_of_root.attrib
branch {'hash': '1cdf045c', 'name': 'codingpy.com'}
branch {'hash': 'f200013e', 'name': 'release01'}
branch {'name': 'invalid'}
我们还可以通过索引值来访问特定的子元素:
&&& root[0].tag, root[0].text
('branch', '\n&&& text,source\n& ')
2、查找需要的元素
从上面的示例中,可以明显发现我们能够通过简单的递归方法(对每一个元素,递归式访问其所有子元素)获取树中的所有元素。但是,由于这是十分常见的工作,ET提供了一些简便的实现方法。
Element对象有一个iter方法,可以对某个元素对象之下所有的子元素进行深度优先遍历(DFS)。ElementTree对象同样也有这个方法。下面是查找XML文档中所有元素的最简单方法:
&&& for elem in tree.iter():
...& print elem.tag, elem.attrib
branch {'hash': '1cdf045c', 'name': 'codingpy.com'}
branch {'hash': 'f200013e', 'name': 'release01'}
sub-branch {'name': 'subrelease01'}
branch {'name': 'invalid'}
在此基础上,我们可以对树进行任意遍历——遍历所有元素,查找出自己感兴趣的属性。但是ET可以让这个工作更加简便、快捷。iter方法可以接受tag名称,然后遍历所有具备所提供tag的元素:
&&& for elem in tree.iter(tag='branch'):
...& print elem.tag, elem.attrib
branch {'hash': '1cdf045c', 'name': 'codingpy.com'}
branch {'hash': 'f200013e', 'name': 'release01'}
branch {'name': 'invalid'}
3、支持通过XPath查找元素
使用XPath查找感兴趣的元素,更加方便。Element对象中有一些find方法可以接受Xpath路径作为参数,find方法会返回第一个匹配的子元素,findall以列表的形式返回所有匹配的子元素, iterfind则返回一个所有匹配元素的迭代器(iterator)。ElementTree对象也具备这些方法,相应地它的查找是从根节点开始的。
下面是一个使用XPath查找元素的示例:
&&& for elem in tree.iterfind('branch/sub-branch'):
...& print elem.tag, elem.attrib
sub-branch {'name': 'subrelease01'}
上面的代码返回了branch元素之下所有tag为sub-branch的元素。接下来查找所有具备某个name属性的branch元素:
&&& for elem in tree.iterfind('branch[@name="release01"]'):
...& print elem.tag, elem.attrib
branch {'hash': 'f200013e', 'name': 'release01'}
4、构建XML文档
利用ET,很容易就可以完成XML文档构建,并写入保存为文件。ElementTree对象的write方法就可以实现这个需求。
一般来说,有两种主要使用场景。一是你先读取一个XML文档,进行修改,然后再将修改写入文档,二是从头创建一个新XML文档。
修改文档的话,可以通过调整Element对象来实现。请看下面的例子:
&&& root = tree.getroot()
&&& del root[2]
&&& root[0].set('foo', 'bar')
&&& for subelem in root:
...& print subelem.tag, subelem.attrib
branch {'foo': 'bar', 'hash': '1cdf045c', 'name': 'codingpy.com'}
branch {'hash': 'f200013e', 'name': 'release01'}
在上面的代码中,我们删除了root元素的第三个子元素,为第一个子元素增加了新属性。这个树可以重新写入至文件中。最终的XML文档应该是下面这样的:
&&& import sys
&&& tree.write(sys.stdout)
&&&branch foo="bar" hash="1cdf045c" name="codingpy.com"&
&&&&text,source
&&&/branch&
&&&branch hash="f200013e" name="release01"&
&&&&&sub-branch name="subrelease01"&
&&&&&&xml,sgml
&&&&&/sub-branch&
&&&/branch&
请注意,文档中元素的属性顺序与原文档不同。这是因为ET是以字典的形式保存属性的,而字典是一个无序的数据结构。当然,XML也不关注属性的顺序。
从头构建一个完整的文档也很容易。ET模块提供了一个SubElement工厂函数,让创建元素的过程变得很简单:
&&& a = ET.Element('elem')
&&& c = ET.SubElement(a, 'child1')
&&& c.text = "some text"
&&& d = ET.SubElement(a, 'child2')
&&& b = ET.Element('elem_b')
&&& root = ET.Element('root')
&&& root.extend((a, b))
&&& tree = ET.ElementTree(root)
&&& tree.write(sys.stdout)
&root&&elem&&child1&some text&/child1&&child2 /&&/elem&&elem_b /&&/root&
5、利用iterparse解析XML流
XML文档通常都会比较大,如何直接将文档读入内存的话,那么进行解析时就会出现问题。这也就是为什么不建议使用DOM,而是SAX API的理由之一。
我们上面谈到,ET可以将XML文档加载为保存在内存里的树(in-memory tree),然后再进行处理。但是在解析大文件时,这应该也会出现和DOM一样的内存消耗大的问题吧?没错,的确有这个问题。为了解决这个问题,ET提供了一个类似SAX的特殊工具——iterparse,可以循序地解析XML。
接下来,笔者为大家展示如何使用iterparse,并与标准的树解析方式进行对比。我们使用一个自动生成的XML文档,下面是该文档的开头部分:
&?xml version="1.0" standalone="yes"?&
&&regions&
&&&africa&
&&&&item id="item0"&
&&&&&location&United States&/location&&
&&&&&quantity&1&/quantity&
&&&&&name&duteous nine eighteen &/name&
&&&&&payment&Creditcard&/payment&
&&&&&description&
&&&&&&parlist&
我们来统计一下文档中出现了多少个文本值为Zimbabwe的location元素。下面是使用ET.parse的标准方法:
tree = ET.parse(sys.argv[2])
for elem in tree.iter(tag='location'):
&&if elem.text == 'Zimbabwe':
&&&&count += 1
print count
上面的代码会将全部元素载入内存,逐一解析。当解析一个约100MB的XML文档时,运行上面脚本的Python进程的内存使用峰值为约560MB,总运行时间问2.9秒。
请注意,我们其实不需要讲整个树加载到内存里。只要检测出文本为相应值得location元素即可。其他数据都可以废弃。这时,我们就可以用上iterparse方法了:
for event, elem in ET.iterparse(sys.argv[2]):
&&if event == 'end':
&&&&if elem.tag == 'location' and elem.text == 'Zimbabwe':
&&&&&&count += 1
&&elem.clear()
print count
上面的for循环会遍历iterparse事件,首先检查事件是否为end,然后判断元素的tag是否为location,以及其文本值是否符合目标值。另外,调用elem.clear()非常关键:因为iterparse仍然会生成一个树,只是循序生成的而已。废弃掉不需要的元素,就相当于废弃了整个树,释放出系统分配的内存。
当利用上面这个脚本解析同一个文件时,内存使用峰值只有7MB,运行时间为2.5秒。速度提升的原因,是我们这里只在树被构建时,遍历一次。而使用parse的标准方法是先完成整个树的构建后,才再次遍历查找所需要的元素。
iterparse的性能与SAX相当,但是其API却更加有用:iterparse会循序地构建树;而利用SAX时,你还得自己完成树的构建工作。
阅读(...) 评论()详细解读Python中解析XML数据的方法
转载 & & 投稿:goldensun
这篇文章主要介绍了Python中解析XML数据的方法,是Python入门学习中的基础知识,需要的朋友可以参考下
Python可以使用 xml.etree.ElementTree 模块从简单的XML文档中提取数据。 为了演示,假设你想解析Planet Python上的RSS源。下面是相应的代码:
from urllib.request import urlopen
from xml.etree.ElementTree import parse
# Download the RSS feed and parse it
u = urlopen('http://planet.python.org/rss20.xml')
doc = parse(u)
# Extract and output tags of interest
for item in doc.iterfind('channel/item'):
title = item.findtext('title')
date = item.findtext('pubDate')
link = item.findtext('link')
print(title)
print(date)
print(link)
运行上面的代码,输出结果类似这样:
Steve Holden: Python for Data Analysis
Mon, 19 Nov :51 +0000
http://holdenweb.blogspot.com/2012/11/python-for-data-analysis.html
Vasudev Ram: The Python Data model (for v2 and v3)
Sun, 18 Nov :47 +0000
http://jugad2.blogspot.com/2012/11/the-python-data-model.html
Python Diary: Been playing around with Object Databases
Sun, 18 Nov :29 +0000
http://www.pythondiary.com/blog/Nov.18,2012/been-...-object-databases.html
Vasudev Ram: Wakari, Scientific Python in the cloud
Sun, 18 Nov :41 +0000
http://jugad2.blogspot.com/2012/11/wakari-scientific-python-in-cloud.html
Jesse Jiryu Davis: Toro: synchronization primitives for Tornado coroutines
Sun, 18 Nov :49 +0000
http://feedproxy.google.com/~r/EmptysquarePython/~3/_DOZT2Kd0hQ/
很显然,如果你想做进一步的处理,你需要替换 print() 语句来完成其他有趣的事。
在很多应用程序中处理XML编码格式的数据是很常见的。 不仅因为XML在Internet上面已经被广泛应用于数据交换, 同时它也是一种存储应用程序数据的常用格式(比如字处理,音乐库等)。 接下来的讨论会先假定读者已经对XML基础比较熟悉了。
在很多情况下,当使用XML来仅仅存储数据的时候,对应的文档结构非常紧凑并且直观。 例如,上面例子中的RSS订阅源类似于下面的格式:
&?xml version="1.0"?&
&rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"&
&title&Planet Python&/title&
&link&http://planet.python.org/&/link&
&language&en&/language&
&description&Planet Python - http://planet.python.org/&/description&
&title&Steve Holden: Python for Data Analysis&/title&
&guid&http://holdenweb.blogspot.com/...-data-analysis.html&/guid&
&link&http://holdenweb.blogspot.com/...-data-analysis.html&/link&
&description&...&/description&
&pubDate&Mon, 19 Nov :51 +0000&/pubDate&
&title&Vasudev Ram: The Python Data model (for v2 and v3)&/title&
&guid&http://jugad2.blogspot.com/...-data-model.html&/guid&
&link&http://jugad2.blogspot.com/...-data-model.html&/link&
&description&...&/description&
&pubDate&Sun, 18 Nov :47 +0000&/pubDate&
&title&Python Diary: Been playing around with Object Databases&/title&
&guid&http://www.pythondiary.com/...-object-databases.html&/guid&
&link&http://www.pythondiary.com/...-object-databases.html&/link&
&description&...&/description&
&pubDate&Sun, 18 Nov :29 +0000&/pubDate&
&/channel&
xml.etree.ElementTree.parse() 函数解析整个XML文档并将其转换成一个文档对象。 然后,你就能使用 find() 、iterfind() 和 findtext() 等方法来搜索特定的XML元素了。 这些函数的参数就是某个指定的标签名,例如 channel/item 或 title 。
每次指定某个标签时,你需要遍历整个文档结构。每次搜索操作会从一个起始元素开始进行。 同样,每次操作所指定的标签名也是起始元素的相对路径。 例如,执行 doc.iterfind('channel/item') 来搜索所有在 channel 元素下面的 item 元素。 doc 代表文档的最顶层(也就是第一级的 rss 元素)。 然后接下来的调用 item.findtext() 会从已找到的 item 元素位置开始搜索。
ElementTree 模块中的每个元素有一些重要的属性和方法,在解析的时候非常有用。 tag 属性包含了标签的名字,text 属性包含了内部的文本,而 get() 方法能获取属性值。例如:
&xml.etree.ElementTree.ElementTree object at 0x&
&&& e = doc.find('channel/title')
&Element 'title' at 0x&
&&& e.text
'Planet Python'
&&& e.get('some_attribute')
有一点要强调的是 xml.etree.ElementTree 并不是XML解析的唯一方法。 对于更高级的应用程序,你需要考虑使用 lxml 。 它使用了和ElementTree同样的编程接口,因此上面的例子同样也适用于lxml。 你只需要将刚开始的import语句换成 from lxml.etree import parse 就行了。 lxml 完全遵循XML标准,并且速度也非常快,同时还支持验证,XSLT,和XPath等特性。
增量式解析大型XML文件
任何时候只要你遇到增量式的数据处理时,第一时间就应该想到迭代器和生成器。 下面是一个很简单的函数,只使用很少的内存就能增量式的处理一个大型XML文件:
from xml.etree.ElementTree import iterparse
def parse_and_remove(filename, path):
path_parts = path.split('/')
doc = iterparse(filename, ('start', 'end'))
# Skip the root element
tag_stack = []
elem_stack = []
for event, elem in doc:
if event == 'start':
tag_stack.append(elem.tag)
elem_stack.append(elem)
elif event == 'end':
if tag_stack == path_parts:
yield elem
elem_stack[-2].remove(elem)
tag_stack.pop()
elem_stack.pop()
except IndexError:
为了测试这个函数,你需要先有一个大型的XML文件。 通常你可以在政府网站或公共数据网站上找到这样的文件。 例如,你可以下载XML格式的芝加哥城市道路坑洼数据库。 在写这本书的时候,下载文件已经包含超过100,000行数据,编码格式类似于下面这样:
假设你想写一个脚本来按照坑洼报告数量排列邮编号码。你可以像这样做:
from xml.etree.ElementTree import parse
from collections import Counter
potholes_by_zip = Counter()
doc = parse('potholes.xml')
for pothole in doc.iterfind('row/row'):
potholes_by_zip[pothole.findtext('zip')] += 1
for zipcode, num in potholes_by_zip.most_common():
print(zipcode, num)
这个脚本唯一的问题是它会先将整个XML文件加载到内存中然后解析。 在我的机器上,为了运行这个程序需要用到450MB左右的内存空间。 如果使用如下代码,程序只需要修改一点点:
from collections import Counter
potholes_by_zip = Counter()
data = parse_and_remove('potholes.xml', 'row/row')
for pothole in data:
potholes_by_zip[pothole.findtext('zip')] += 1
for zipcode, num in potholes_by_zip.most_common():
print(zipcode, num)
结果是:这个版本的代码运行时只需要7MB的内存–大大节约了内存资源。
这里技术会依赖 ElementTree 模块中的两个核心功能。 第一,iterparse() 方法允许对XML文档进行增量操作。 使用时,你需要提供文件名和一个包含下面一种或多种类型的事件列表: start , end, start-ns 和 end-ns 。 由 iterparse() 创建的迭代器会产生形如 (event, elem) 的元组, 其中 event 是上述事件列表中的某一个,而 elem 是相应的XML元素。例如:
&&& data = iterparse('potholes.xml',('start','end'))
&&& next(data)
('start', &Element 'response' at 0x&)
&&& next(data)
('start', &Element 'row' at 0x&)
&&& next(data)
('start', &Element 'row' at 0x&)
&&& next(data)
('start', &Element 'creation_date' at 0x&)
&&& next(data)
('end', &Element 'creation_date' at 0x&)
&&& next(data)
('start', &Element 'status' at 0x&)
&&& next(data)
('end', &Element 'status' at 0x&)
start 事件在某个元素第一次被创建并且还没有被插入其他数据(如子元素)时被创建。 而 end 事件在某个元素已经完成时被创建。 尽管没有在例子中演示, start-ns 和 end-ns 事件被用来处理XML文档命名空间的声明。
这本节例子中, start 和 end 事件被用来管理元素和标签栈。 栈代表了文档被解析时的层次结构, 还被用来判断某个元素是否匹配传给函数 parse_and_remove() 的路径。 如果匹配,就利用 yield 语句向调用者返回这个元素。
在 yield 之后的下面这个语句才是使得程序占用极少内存的ElementTree的核心特性:
elem_stack[-2].remove(elem)
这个语句使得之前由 yield 产生的元素从它的父节点中删除掉。 假设已经没有其它的地方引用这个元素了,那么这个元素就被销毁并回收内存。
对节点的迭代式解析和删除的最终效果就是一个在文档上高效的增量式清扫过程。 文档树结构从始自终没被完整的创建过。尽管如此,还是能通过上述简单的方式来处理这个XML数据。
这种方案的主要缺陷就是它的运行性能了。 我自己测试的结果是,读取整个文档到内存中的版本的运行速度差不多是增量式处理版本的两倍快。 但是它却使用了超过后者60倍的内存。 因此,如果你更关心内存使用量的话,那么增量式的版本完胜。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Python使用MYSQLDB实现从数据库中导出XML文件的方法
转载 & & 作者:蛇小狼
这篇文章主要介绍了Python使用MYSQLDB实现从数据库中导出XML文件的方法,涉及Python使用MYSQLDB操作数据库及XML文件的相关技巧,需要的朋友可以参考下
本文实例讲述了Python使用MYSQLDB实现从数据库中导出XML文件的方法。分享给大家供大家参考。具体分析如下:
这里需要给前端以xml格式提供一些数据,这些数据在目前的数据库中已经存在。
如果使用django返回xml数据的话,需要包装下头信息:
代码如下:r = HttpResponse(str_xml)
r.mimetype = "text/xml"
r['Content-Type'] = "application/xml"
另外,使用group by可以使用以下方式来查询。
代码如下:objs = Fish.objects.raw("SELECT& id, almanac_name, style , almanac_code,almanac_description FROM ppy_fish WHERE almanac_name != ''& GROUP BY almanac_code")
简单的举个例子:
# -*- coding: utf-8 -*-
from xml.dom import minidom
import MySQLdb
conn = MySQLdb.connect(host='localhost',user='root',passwd='xxx',db='my_xml',charset="utf8")
cursor = conn.cursor()
cursor.execute('select id, name, style, description, family from ppy_fish')
res_list = cursor.fetchall()
print len(res_list)
doc = minidom.Document()
root = doc.createElement("data")
doc.appendChild(root)
ATTRIBUTE = {"n":1, "d":3}
for res in res_list:
node = doc.createElement(res[2])
for i in ATTRIBUTE:
id_node = doc.createElement("%s" % i)
data = doc.createTextNode("%s" % res[ATTRIBUTE[i]])
id_node.appendChild(data)
node.appendChild(id_node)
root.appendChild(node)
str_xml = doc.toxml("utf-8")
f = open('fish.xml', 'w')
f.write(str_xml)
cursor.close()
conn.close()
希望本文所述对大家的Python程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 数据库结构 的文章

 

随机推荐