python读写xml文件
⑴ python操作xml文件问题
我给你个示例代码,你自己改改增加子节点那一段就好了。
#!/usr/bin/python
# -*- coding=utf-8 -*-
# author : [email protected]
# date: 2012-05-25
# version: 0.1
from xml.etree.ElementTree import ElementTree,Element
def read_xml(in_path):
'''读取并解析xml文件
in_path: xml路径
return: ElementTree'''
tree = ElementTree()
tree.parse(in_path)
return tree
def write_xml(tree, out_path):
'''将xml文件写出
tree: xml树
out_path: 写出路径'''
tree.write(out_path, encoding="utf-8",xml_declaration=True)
def if_match(node, kv_map):
'''判断某个节点是否包含所有传入参数属性
node: 节点
kv_map: 属性及属性值组成的map'''
for key in kv_map:
if node.get(key) != kv_map.get(key):
return False
return True
#---------------search -----
def find_nodes(tree, path):
'''查找某个路径匹配的所有节点
tree: xml树
path: 节点路径'''
return tree.findall(path)
def get_node_by_keyvalue(nodelist, kv_map):
'''根据属性及属性值定位符合的节点,返回节点
nodelist: 节点列表
kv_map: 匹配属性及属性值map'''
result_nodes = []
for node in nodelist:
if if_match(node, kv_map):
result_nodes.append(node)
return result_nodes
#---------------change -----
def change_node_properties(nodelist, kv_map, is_delete=False):
'''修改/增加 /删除 节点的属性及属性值
nodelist: 节点列表
kv_map:属性及属性值map'''
for node in nodelist:
for key in kv_map:
if is_delete:
if key in node.attrib:
del node.attrib[key]
else:
node.set(key, kv_map.get(key))
def change_node_text(nodelist, text, is_add=False, is_delete=False):
'''改变/增加/删除一个节点的文本
nodelist:节点列表
text : 更新后的文本'''
for node in nodelist:
if is_add:
node.text += text
elif is_delete:
node.text = ""
else:
node.text = text
def create_node(tag, property_map, content):
'''新造一个节点
tag:节点标签
property_map:属性及属性值map
content: 节点闭合标签里的文本内容
return 新节点'''
element = Element(tag, property_map)
element.text = content
return element
def add_child_node(nodelist, element):
'''给一个节点添加子节点
nodelist: 节点列表
element: 子节点'''
for node in nodelist:
node.append(element)
def del_node_by_tagkeyvalue(nodelist, tag, kv_map):
'''同过属性及属性值定位一个节点,并删除之
nodelist: 父节点列表
tag:子节点标签
kv_map: 属性及属性值列表'''
for parent_node in nodelist:
children = parent_node.getchildren()
for child in children:
if child.tag == tag and if_match(child, kv_map):
parent_node.remove(child)
if __name__ == "__main__":
#1. 读取xml文件
tree = read_xml("./test.xml")
#2. 属性修改
#A. 找到父节点
nodes = find_nodes(tree, "processers/processer")
#B. 通过属性准确定位子节点
result_nodes = get_node_by_keyvalue(nodes, {"name":"BProcesser"})
#C. 修改节点属性
change_node_properties(result_nodes, {"age": "1"})
#D. 删除节点属性
change_node_properties(result_nodes, {"value":""}, True)
#3. 节点修改
#A.新建节点
a = create_node("person", {"age":"15","money":"200000"}, "this is the firest content")
#B.插入到父节点之下
add_child_node(result_nodes, a)
#4. 删除节点
#定位父节点
del_parent_nodes = find_nodes(tree, "processers/services/service")
#准确定位子节点并删除之
target_del_node = del_node_by_tagkeyvalue(del_parent_nodes, "chain", {"sequency" : "chain1"})
#5. 修改节点文本
#定位节点
text_nodes = get_node_by_keyvalue(find_nodes(tree, "processers/services/service/chain"), {"sequency":"chain3"})
change_node_text(text_nodes, "new text")
#6. 输出到结果文件
write_xml(tree, "./out.xml")
⑵ 如何用python读取一个xml文件然后替换某个节点的值
其实python有解析xml的模块
只是你这个xml文件太简单,字符串处理就够了
还是一样,按行搜索,加个flag,读到b并且attr=2是flag=1
如果flag=1且本行是<b2>就替换数值,flag=0
等循环完了,写入新文件就行
⑶ python怎么读取xml
引入XML组件:import xml.dom.minidom。
创建一个xml文件,<?xml version="1.0" encoding="utf-8"?>。
相关推荐:《Python教程》
加载读取XML文件,xml.dom.minidom.parse('abc.xml'),这是xml文件的对象。
获取XML文档对象,root = dom.documentElement。
获取标签之间的数据 ,rootdata.getElementsByTagName('caption')。
总结一下xml对象,node.getAttribute(AttributeName),获取XML节点属性值,node.getElementsByTagName(TagName),获取XML节点对象集合,等等具体的查看手册。
⑷ python读取xml文件报错ValueError: multi-byte encodings are not supported
问题 在使用python对xml文件进行读取时,提示ValueError: multi-byte encodings are not supported
xml是用gb2312编码的。
很多贴子上说把xml的编码格式改为utf-8,就可以正常执行了。
但是这里有一个问题,xml原先的编码格式和encoding字段显示的编码格式都是gb2312,如果只改了encoding字段,之后再使用这个xml文件,就会按utf-8解析gb2312,会造成不可预知的后果。
第二个问题就是指改一个xml文件还好,但是有几百上千的时候,改这个就不方便了。
解决方案 用parseString函数
python提供了两种xml的输入方式,一种是文件,一种是字符串。我们可以先将xml文件读入内存,然后关闭文件。再将xml字符串中的gb2312用replace改为utf-8,然后用parseString解析,这样就不会报错。
注意事项 如果文件过大,有可能内存不够,所以适用于小的xml文件。注意要把不使用的文件给close掉,以免占用文件描述符。
⑸ 1、使用python读取依据生成的xml文件,添加样式表,最中生成一个html文件
#coding=utf8
#引入要用到的xml解析库这里我们用比较轻量级的minidom就行了
importxml.dom.minidom
#定义一个html输出模板
#后面我们只是要把这段html中的学生数据部分(<student_trs/>)换成xml中读到的数据
template="""
<html>
<tableborder="1"style="width:100%;text-align:center;">
<tr>
<tdcolspan="4">学生信息</td>
</tr>
<student_trs/>
</table>
</html>
"""
#读取xml文档内容,这里假设是a.xml
dom=xml.dom.minidom.parse('a.xml')
#获取xml中的所有student节点
student_nodes=dom.getElementsByTagName('student')
#初始化student_trs为空
student_trs=""
#遍历每一条学生信息
fornodeinstudent_nodes:
#getAttribute用户获取节点的属性,得到id属性值即学号
#因为xml解析后是Unicode编码的,所以这里要转成utf8编码,下面同理
sid=node.getAttribute("id").encode('utf-8')
#获取所有子节点
children=node.childNodes
forchildinchildren:
#判断子节点的名字为姓名、性别、专业的话,就采集其对应文本
ifchild.nodeName.encode('utf-8')=="姓名":
#使用。childNodes[0].nodeValue的方法得到节点的文本
name=child.childNodes[0].nodeValue.encode('utf-8')
ifchild.nodeName.encode('utf-8')=="性别":
sex=child.childNodes[0].nodeValue.encode('utf-8')
ifchild.nodeName.encode('utf-8')=="专业":
specialty=child.childNodes[0].nodeValue.encode('utf-8')
#组成html中的一行学生数据
student_tr="<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>"%(sid,name,sex,specialty)
#将这一行数据添加到总数据中
student_trs+=student_tr
#替换模板的<student_trs/>为我们上面所得到的html数据
html=template.replace("<student_trs/>",student_trs)
#输入html结果到output.html
open("output.html","w").write(html)
#PS:你提供的xml数据有问题,确实了一个</students>标记
#正确的xml应该如下
"""
<?xmlversion="1.0"encoding="UTF-8"?>
<person>
<students>
<studentid="20140711">
<姓名>三</姓名>
<性别>男</性别>
<专业>计算机</专业>
</student>
</students>
</person>
"""
⑹ Python读取xml文件总是报错,小白,求解答
这种一般直接看最后一行:
xml.parsers.expat.ExpatError: XML declaration not well-formed: line 1, column 20
XML声明格式不正确,第1行第20列(第20个字符),你自己按这个信息去检查。
⑺ 使用python 读取此XML文件,并把读取的到内容写到一个txt文件中;
#vim info.xml
<info>
<intro>信息</intro>
<listid='001'>
<head>auto_userone</head>
<name>Jordy</name>
</list>
</info>
#vim infoxmlparser.py
#!/usr/bin/python
#coding=utf-8
#PythonVersionPython2.6.5
fromxml.sax.handlerimportContentHandler
fromxml.saximportparse
classHeadlineHandler(ContentHandler):
in_headline=False
def__init__(self):
ContentHandler.__init__(self)
self.data=[]
self.file=open('info.txt','w')
self.file.writelines('id'+' '+'head ')
self.file.close()
defstartElement(self,name,attrs):
ifname=='list':
self.data.append(attrs['id'])
ifname=='head':
self.in_headline=True
defendElement(self,name):
ifname=='list':
self.file=open('info.txt','a')
self.file.writelines(self.data[0]+' '+self.data[1]+' ')
self.file.close()
self.data=[]
ifname=='head':
self.in_headline=False
defcharacters(self,string):
ifself.in_headline:
self.data.append(string)
if__name__=='__main__':
parse('info.xml',HeadlineHandler())
执行&结果
#pythoninfoxmlparser.py
#catinfo.txt
idhead
001auto_userone
⑻ 初学Python求助Python解析xml
python有三种方法解析XML,分别是SAX,DOM,以及ElementTree:
SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
DOM模型将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
Python 解析XML实例:
#!/usr/bin/python
#-*-coding:UTF-8-*-
importxml.sax
classMovieHandler(xml.sax.ContentHandler):
def__init__(self):
self.CurrentData=""
self.type=""
self.format=""
self.year=""
self.rating=""
self.stars=""
self.description=""
#元素开始事件处理
defstartElement(self,tag,attributes):
self.CurrentData=tag
iftag=="movie":
print"*****Movie*****"
title=attributes["title"]
print"Title:",title
#元素结束事件处理
defendElement(self,tag):
ifself.CurrentData=="type":
print"Type:",self.type
elifself.CurrentData=="format":
print"Format:",self.format
elifself.CurrentData=="year":
print"Year:",self.year
elifself.CurrentData=="rating":
print"Rating:",self.rating
elifself.CurrentData=="stars":
print"Stars:",self.stars
elifself.CurrentData=="description":
print"Description:",self.description
self.CurrentData=""
#内容事件处理
defcharacters(self,content):
ifself.CurrentData=="type":
self.type=content
elifself.CurrentData=="format":
self.format=content
elifself.CurrentData=="year":
self.year=content
elifself.CurrentData=="rating":
self.rating=content
elifself.CurrentData=="stars":
self.stars=content
elifself.CurrentData=="description":
self.description=content
if(__name__=="__main__"):
#创建一个XMLReader
parser=xml.sax.make_parser()
#turnoffnamepsaces
parser.setFeature(xml.sax.handler.feature_namespaces,0)
#重写ContextHandler
Handler=MovieHandler()
parser.setContentHandler(Handler)
parser.parse("movies.xml")
⑼ 如何用python读取xml文件
一、简介
XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用。它是web发展到一定阶段的必然产物,既具有SGML的核心特征,又有着HTML的简单特性,还具有明确和结构良好等许多新的特性。
python解析XML常见的有三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合,注意xml.dom包里面有许多模块,须区分它们间的不同;二是xml.sax.*模块,它是SAX API的实现,这个模块牺牲了便捷性来换取速度和内存占用,SAX是一个基于事件的API,这就意味着它可以“在空中”处理庞大数量的的文档,不用完全加载进内存;三是xml.etree.ElementTree模块(简称 ET),它提供了轻量级的Python式的API,相对于DOM来说ET 快了很多,而且有很多令人愉悦的API可以使用,相对于SAX来说ET的ET.iterparse也提供了 “在空中” 的处理方式,没有必要加载整个文档到内存,ET的性能的平均值和SAX差不多,但是API的效率更高一点而且使用起来很方便。
二、详解
解析的xml文件(country.xml):
在CODE上查看代码片派生到我的代码片
<?xml version="1.0"?>
<data>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>
1、xml.etree.ElementTree
ElementTree生来就是为了处理XML,它在Python标准库中有两种实现:一种是纯Python实现的,如xml.etree.ElementTree,另一种是速度快一点的xml.etree.cElementTree。注意:尽量使用C语言实现的那种,因为它速度更快,而且消耗的内存更少。
在CODE上查看代码片派生到我的代码片
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
这是一个让Python不同的库使用相同API的一个比较常用的办法,而从Python 3.3开始ElementTree模块会自动寻找可用的C库来加快速度,所以只需要import xml.etree.ElementTree就可以了。
在CODE上查看代码片派生到我的代码片
#!/usr/bin/evn python
#coding:utf-8
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
import sys
try:
tree = ET.parse("country.xml") #打开xml文档
#root = ET.fromstring(country_string) #从字符串传递xml
root = tree.getroot() #获得root节点
except Exception, e:
print "Error:cannot parse file:country.xml."
sys.exit(1)
print root.tag, "---", root.attrib
for child in root:
print child.tag, "---", child.attrib
print "*"*10
print root[0][1].text #通过下标访问
print root[0].tag, root[0].text
print "*"*10
for country in root.findall('country'): #找到root节点下的所有country节点
rank = country.find('rank').text #子节点下节点rank的值
name = country.get('name') #子节点下属性name的值
print name, rank
#修改xml文件
for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)
tree.write('output.xml')
运行结果:
三、总结
(1)Python中XML解析可用的类库或模块有xml、libxml2 、lxml 、xpath等,需要深入了解的还需参考相应的文档。
(2)每一种解析方式都有自己的优点和缺点,选择前可以综合各个方面的性能考虑。
(3)若有不足,请留言,在此先感谢!