当前位置:首页 » 编程语言 » python写入xml文件

python写入xml文件

发布时间: 2023-03-22 15:19:26

① 如何用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)若有不足,请留言,在此先感谢!

② python xml循环写入覆盖了怎么办

在输入一遍。
这种情况下,执行该package时会抛出error错误,即循环引用,因为molea试图去引入moleb时,而moleb首先要引入molea,这会导致Python解释器无法执行下去。
mole中的函数以attribute的方式引用anothermole中的函数或变量等,之所以要挂上packagename来引入,是由于import这种形式的相对引入会报语法错误,而挂上package的绝对引入,Python2和3都支持。

③ 求大神指教:如何用python读取xml文件中指定标签的文档内容并将其修改最好写下详细代码,非常感谢哈!

使用python自带的ElementTree模块,给你个例子你就知道了

xml文档
<?xml version="1.0" encoding="utf-8"?>
<config>
<id>0</id>
<log_path>E:/Python</log_path>
</config>

Python 代码,修改id节的内容

from xml.etree import ElementTree
xml_file='config.xml'
xml=ElementTree.ElementTree(file=xml_file).getroot()
xml.find('id').text=1

④ 如何用python读取一个xml文件然后替换某个节点的值

其实python有解析xml的模块
只是你这个xml文件太简单,字符串处理就够了
还是一样,按行搜索,加个flag,读到b并且attr=2是flag=1
如果flag=1且本行是<b2>就替换数值,flag=0
等循环完了,写入新文件就行

⑤ python解析xml,包含中文,gb2312编码。修改xml后重新写入xml有些内容怎么变了 我的步骤如下:

可能是python内置模块的输出是那样的,不需要用ue转,我觉得直接当文本读入内容MSG,然后解码再编码msg.decode("gb2312").encode("utf-8"),然后用正则表达式<xx>替换内容</xx>来替换内容。。。个人觉得省事些,当然要看你具体情况

⑥ 如何用Python创建生成xml文档文件的方法

1、内存数据产生

2、产生xml内存对象(也就是DOM树)

3、产生根对象

4、往根对象里加数据

5、把xml内存对象写到文件

下面是一个创建xml文档的简单实例:

importxml.dom.minidom#在内存中创建一个空的文档doc=xml.dom.minidom.Document()
#创建一个根节点Managers对象root=doc.createElement('Managers')
#设置根节点的属性root.setAttribute('company','xx科技')
root.setAttribute('address','科技软件园')
#将根节点添加到文档对象中doc.appendChild(root)

managerList=[{'name':'joy','age':27,'sex':'女'},
{'name':'tom','age':30,'sex':'男'},
{'name':'ruby','age':29,'sex':'女'}
]foriinmanagerList:
nodeManager=doc.createElement('Manager')
nodeName=doc.createElement('name')
#给叶子节点name设置一个文本节点,用于显示文本内容
nodeName.appendChild(doc.createTextNode(str(i['name'])))

nodeAge=doc.createElement("age")
nodeAge.appendChild(doc.createTextNode(str(i["age"])))

nodeSex=doc.createElement("sex")
nodeSex.appendChild(doc.createTextNode(str(i["sex"])))

#将各叶子节点添加到父节点Manager中,
#最后将Manager添加到根节点Managers中
nodeManager.appendChild(nodeName)
nodeManager.appendChild(nodeAge)
nodeManager.appendChild(nodeSex)
root.appendChild(nodeManager)#开始写xml文档fp=open('c:\wcx\Manager.xml','w')
doc.writexml(fp,indent=' ',addindent=' ',newl=' ',encoding="utf-8")

执行结果:

<?xmlversion="1.0"encoding="utf-8"?>
<Managersaddress="科技软件园"company="xx科技">
<Manager>
<name>joy</name>
<age>27</age>
<sex>女</sex>
</Manager>
<Manager>
<name>tom</name>
<age>30</age>
<sex>男</sex>
</Manager>
<Manager>
<name>ruby</name>
<age>29</age>
<sex>女</sex>
</Manager>
</Managers>

6.用Python自带的写xml文档的API去写,比较方便,后期容易维护。如果直接用打开文件的方式,一行一行的去写,比较费时,也难以维护。

⑦ 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.etree 解析xml,然后找到对应的节点把数据添加进去,重新写入文件。

热点内容
如何把手机改安卓10 发布:2024-05-05 17:39:07 浏览:496
我的世界怎么扩容服务器内存 发布:2024-05-05 17:19:54 浏览:48
java读取文件字符 发布:2024-05-05 17:15:18 浏览:11
三星怎么应用加密 发布:2024-05-05 17:13:18 浏览:152
cad字体在那个文件夹 发布:2024-05-05 17:08:20 浏览:331
什么时候用编译器 发布:2024-05-05 17:08:20 浏览:766
应急救援脚本 发布:2024-05-05 17:08:17 浏览:338
我的世界搭建无正版验证服务器 发布:2024-05-05 17:03:48 浏览:819
我的世界服务器地址宝可梦 发布:2024-05-05 17:00:16 浏览:256
dede企业源码 发布:2024-05-05 16:57:53 浏览:787