主页 > 创业  > 

python处理xml文件

python处理xml文件
一、python 操作xml的方式介绍

    查看全部包含“三种⽅法:     ⼀是xml.dom. * 模块,它是W3CDOMAPI的实现,若需要处理DOMAPI则该模块很适合;     ⼆是xml.sax. * 模块,它是SAXAPI的实现,这个模块牺牲了便捷性来换取速度和内存占⽤,SAX是⼀个基于事件的API,这就意味着它可以“在空中”处理庞⼤数量的的⽂档,不⽤完全加载进内存;     三是xml.etree.ElementTree模块(简称 ET),它提供了轻量级的Python式的API,相对于DOM来说ET 快了很多,⽽且有很多令⼈愉悦的API可以使⽤,相对于SAX来说ET的ET.iterparse也提供了 “在空中” 的处理⽅式,没有必要加载整个⽂档到内存,ET的性能的平均值和SAX差不多,但是API的效率更⾼⼀点⽽且使⽤起来很⽅便。

使用 xml.dom. * 模块:

from xml.dom.minidom import Document #创建一个文本 doc = Document() #创建一个父节点 root = doc.createElement("root") #父节点加入文本 doc.appendChild(root) #创建一个子节点 head = doc.createElement("head") #子节点加入父节点 root.appendChild(head) #创建一个属性 text1 = doc.createTextNode("1") #创建一个子节点 code = doc.createElement("code") #子节点加入父节点 code.appendChild(text1) #子节点加入前子节点 head.appendChild(code) #打印一下xml print doc.toxml() #上述输出节点输出为 #<?xml version="1.0" ?><root><head><code>1</code></head></root> text2 = doc.createTextNode("2") Msg = doc.createElement("Msg") Msg.appendChild(text2) head.appendChild(Msg) #print doc.toxml() #输出文件 with open("testq.arxml","w+") as f: #文件转码decode是为了保证输出的是UTF-8格式 f.write(doc.toprettyxml(encoding = "UTF-8").decode("UTF-8")) f.close()

原文:Python学习(十四):Python如何创建一个xml文件_python生成xml文件-CSDN博客

最常用的是xml.etree.ElementTree模块。

二、ElementTree模块 2.1 解析xml文件,获取根节点,并读取节点内容

注意xml格式的内容应该没有xml格式声明的内容“<?xml version="1.0" encoding="UTF-8"?>”,如果有则会解析错误

from xml.etree import ElementTree as ET # 1、打开xml文件 tree =ET.parse(r"E:\testData\yy001.xml") # 获xml文件的内容取根标签 root = tree.getroot() # 2、读取节点内容 # 2.1 获取根标签下的子标签 for child in root: 获取根节点下的子标签 print(child.tag) # *.tag 是获取标签名字(字符串类型) print( child.attrib) # *.attrib是获取标签属性(字典类型) for node in child: 获取跟标签下子标签的子标签 print(node.tag) print(node.attrib) print(node.text) # *.text 获取标签文本 2.2 通标标签名直接获取标签(find,findall)

find()  此方法只能获取当前标签的下一级子标签,不能查询到下一级的下一级标签,且找到的是第一个相应的标签 findall() 此方法只能获取当前标签的下一级子标签,不能查询到下一级的下一级标签,但是找到下一级的所有符合名称的标签

2.3全文搜索标签名(类似xpath路径查找标签) # 1、打开xml文件 from xml.etree import ElementTree as ET tree = ET.parse(r"E:\testData\yy01.xml") # 获xml文件的内容取根标签 root = tree.getroot() #print(root) # 2.1 通过标签名称获取标签 find() events_object = root.find("Events") # 此种写法只能获取根标签下的一级子标签,即只能查询下一级标签,不能查询到下一级的下一级标签,**且找到的是第一个响应的标签** print(events_object.tag, events_object.attrib) event_object = events_object.find("Event") # 进一步获取跟标签下子标签的子标签 print(event_object.tag,event_object.attrib) # 2.2 通过标签名称获取标签 findall() events_objects = root.findall("Events") # 此种写法只能获取根标签下的一级子标签,即只能查询下一级标签,不能查询到下一级的下一级标签,但是可以获取下一级所有符合名称的标签 for event_clee in events_objects: print(event_clee.tag, event_clee.attrib) event_object = event_clee.findall("Event") # 进一步获取跟标签下子标签的子标签 for relation_cell in event_object: print(relation_cell.tag, relation_cell.attrib) # 2.3 findall(xpath) Events_object = root.findall('.//Code') Events_object1 = root.findall('.//Code[@curCode="010697059381010910N053000117230527"]') Events_object2 = root.findall('.//*[@curCode="010697059381010910N053000117230527"]') #注意 前面的“.”不能省略, print(Events_object) print(Events_object1) print(Events_object2[0]) # 2.4 全文搜索标签名为“Code”的标签 Code_object = root.iter("Code") 全文搜索标签名为“Code”的标签 print(Code_object) for code in Code_object: print(code.tag, code.attrib) 2.4 修改和删除节点 tree =ET.parse(r"E:\testData\yy01.xml") root = tree.getroot() #修改 relation_object = root.find("Events").find("Event").iter("Relation") # 获取第一个Events的一级子标签下的Relation子标签 for relation_cell in relation_object: relation_cell.set("productCode", "产品编码") # 如果有相应属性,则修改属性值,没有则新增 relation_cell.set("productCode2", "产品编码2") relation_cell.find("Batch").find("Code").text="追溯码" # 注意:如果之前是短标签,增加文本属性后自动变为长标签。 # tree = ET.ElementTree(root) tree.write("new.xml", encoding="utf-8",short_empty_elements=True) # 如果文件不存在,则创建文件,如果文件已存在则修改响应内容 ------------------------------------------------------------------------------------------------- #删除 root = tree.getroot() # ####################错误的删除方式######################## # # 获取响应标签 # Event_object = root.find("Events").find("Event") # # 删除相应标签 # root.remove(Event_object) # 删除只能删除其子标签,不能删除其子标签下的子标签,因为relation_object是子标签下的子标签,因此此时删除失败 ################## 正确的删除方式############################# Events_object = root.find("Events") Event_object = Events_object.find("Event") Events_object.remove(Event_object) # tree = ET.ElementTree(root) tree.write("new.xml", encoding="utf-8") # 如果文件不存在,则创建文件,如果文件已存在则修改响应内容 注意:tree.write("newCreate.xml", xml_declaration=True,  encoding="utf-8", short_empty_elements=True) # xml_declaration是否包含声明文件, encoding编码方式,short_empty_elements 规定是短标签(单标签)还是双标签 三、构建文件【xml中换行需要做特殊处理,默认都是在同一行】 方式1 (Element)

先创建各类标签,再建立标签之间关系

from xml.etree import ElementTree as ET # 创建根标签 root = ET.Element("root") # 创建一个标签tagName1 tagName1 = ET.Element("tagName1", {"tag1Attribute":"AttributeValue1"}) # 创建一个标签tagName2 tagName2 = ET.Element("tagName2", {"tag2Attribute":"AttributeValue2"}) # 创建一个标签tagName11 tagName11 = ET.Element("tagName11", {"tag11Attribute":"AttributeValue11"}) # 创建一个标签tagName12 tagName12 = ET.Element("tagName12", {"tag12Attribute":"AttributeValue12"}) # 将标签tagName11和tagName12 添加的tagName1中作为tagName1的子标签 tagName1.append(tagName11) tagName1.append(tagName12) # 将标签tagName1和tagName2 添加的root中作为root的子标签 root.append(tagName1) root.append(tagName2) # 保存 tree = ET.ElementTree(root) tree.write("newCreate.xml", xml_declaration=True, encoding="utf-8",short_empty_elements=True) # xml_declaration是否包含声明文件, encoding编码方式,short_empty_elements 规定是短标签(单标签)还是双标签 <?xml version='1.0' encoding='utf-8'?> <root> <tagName1 tag1Attribute="AttributeValue1"> <tagName11 tag11Attribute="AttributeValue11"/> <tagName12 tag12Attribute="AttributeValue12"/> </tagName1> <tagName2 tag2Attribute="AttributeValue2"/> </root> 方式2 (makeelement) from xml.etree import ElementTree as ET # 创建根节点 root = ET.Element("family") # 创建一级子标签 son1 = root.makeelement("son", {"name":"son1"}) son2 = root.makeelement("son", {"name":"son2"}) # 创建二级子标签 grandson1 = son1.makeelement("grandson1", {"name":"grandson1"}) grandson2 = son1.makeelement("grandson1", {"name":"grandson2"}) # 将二级子标签与一级子标签关联 son1.append(grandson1) son1.append(grandson2) # 将一级子标签与根标签关联 root.append(son2) root.append(son1) tree = ET.ElementTree(root) tree.write("../testData/neswfile.xml", xml_declaration=True, encoding="utf-8", short_empty_elements=False) <?xml version='1.0' encoding='utf-8'?> <family> <son name="son2"></son> <son name="son1"> <grandson1 name="grandson1"></grandson1> <grandson1 name="grandson2"></grandson1> </son> </family> 方式3

此种方式是在创建元素时直接建立相关关系

from xml.etree import ElementTree as ET # 创建根节点 root = ET.Element("family") # 创建一级子标签 son1 = ET.SubElement(root, "son", {"name":"son1"}) son2 = ET.SubElement(root,"son", {"name":"son2"}) # 创建二级子标签 grandson1 = ET.SubElement(son1,"grandson1", {"name":"grandson1"}) grandson1.text="大孙子" grandson2 = ET.SubElement(son1,"grandson1", {"name":"grandson2"}) grandson2.text="小孙子" tree = ET.ElementTree(root) tree.write("../testData/neswfile.xml", xml_declaration=True, encoding="utf-8") <?xml version='1.0' encoding='utf-8'?> <family> <son name="son1"> <grandson1 name="grandson1">大孙子</grandson1> <grandson1 name="grandson2">小孙子</grandson1> </son> <son name="son2"/> </family>

根据xsd生成xml文件 import xmlschema import json from xml.etree.ElementTree import ElementTree my_xsd = '<?xml version="1.0"?> <xs:schema xmlns:xs="http:// .w3.org/2001/XMLSchema"> <xs:element name="note" type="xs:string"/> </xs:schema>' schema = xmlschema.XMLSchema(my_xsd) data = json.dumps({'note': 'this is a Note text'}) xml = xmlschema.from_json(data, schema=schema, preserve_root=True) ElementTree(xml).write('my_xml.xml')

对于更复杂的 xsd,我更喜欢使用 generateDS,它甚至可以为非常大的 xsd 文件创建非常非常可靠的类. 原文链接: blog.csdn.net/Mwyldnje2003/article/details/125819447

四、处理换行问题 def prettyXml(element, indent, newline, level=0): ''' 参数: elemnt为传进来的Elment类; indent用于缩进; newline用于换行; ''' # 判断element是否有子元素 if element: # 如果element的text没有内容 if element.text == None or element.text.isspace(): element.text = newline + indent * (level + 1) else: element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * (level + 1) # 此处两行如果把注释去掉,Element的text也会另起一行 # else: # element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * level temp = list(element) # 将elemnt转成list for subelement in temp: # 如果不是list的最后一个元素,说明下一个行是同级别元素的起始,缩进应一致 if temp.index(subelement) < (len(temp) - 1): subelement.tail = newline + indent * (level + 1) else: # 如果是list的最后一个元素, 说明下一行是母元素的结束,缩进应该少一个 subelement.tail = newline + indent * level # 对子元素进行递归操作 prettyXml(subelement, indent, newline, level=level + 1) tree = ET.parse('filename') root = tree.getroot() root.set('xmlns', 'http://ts.szse /Fund') prettyXml(root, '\t', '\n')

标签:

python处理xml文件由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“python处理xml文件