xml中倆種解析方式
兩種解析方式
1、from xml.etree import ElementTree as ET
利用ElementTree模塊下的xml方法可以把一個字符串類型的東西轉換成Element類,從而利用Element類下面的方法
xml(字符串)解析方式只能讀不能寫
from xml.etree import ElementTree as ET # 打開文件,讀取XML內容 str_xml = open(‘xo.xml‘, ‘r‘).read() # 將字符串解析成xml特殊對象,root代指xml文件的根節點 root = ET.XML(str_xml)
from xml.etree import ElementTree as ET a=open("first_xml","r",encoding="utf-8").read() print(type(a)) b=ET.XML(a) 其中b為根節點#利用xml方法可以的到一個Element類 print(type(b))
<class ‘str‘> 輸入一個字符串類型的轉成Element類
<class ‘xml.etree.ElementTree.Element‘>
def XML(text, parser=None): """Parse XML document from string constant. This function can be used to embed "XML Literals" in Python code. *text* is a string containing XML data, *parser* is an optional parser instance, defaulting to the standard XMLParser. Returns an Element instance.
Element下面的方法:
1、 iter(所查看的東西)返回所匹配到的元素的叠代器 用於找到某一類節點並去循環
Return an iterator containing all the matching elements.
2、 tag 返回節點的標簽名
3、 attrib 返回標簽的屬性
4、 find()找到第一個匹配到的對象並返回 只能找兒子不能找孫子
5、 txet 獲取標簽的內容
2、parse(文件名)打開文件並解析,相比於xml少了打開文件那一步
from xml.etree import ElementTree as ET # 直接解析xml文件 tree = ET.parse("xo.xml") # 獲取xml文件的根節點 root = tree.getroot() 通過getroot獲取根節點
from xml.etree import ElementTree as ET a=ET.parse("first_xml") #解析成ElementTree類的對象
b=a.getroot() #轉換成Element類的對象 print(a.getroot(),type(a)) <Element ‘data‘ at 0x00000033D062F958> <class ‘xml.etree.ElementTree.ElementTree‘>
def parse(source, parser=None): """Parse XML document into element tree. *source* is a filename or file object containing XML data, *parser* is an optional parser instance defaulting to XMLParser. Return an ElementTree instance. """ tree = ElementTree() tree.parse(source, parser) return tree
ElementTree下面的方法:
1、 getroot() 獲取xml文件的根節點 與xml不同(通過xml()直接獲取根節點,而parse()還的再通過getroot獲取根節點)
2、 根節點.tag 獲取節點的標簽(這裏與xml不同的是先利用getroot()得到根節點再tag)
3、 根節點.attrib 獲取節點的屬性(原理同上)
4、 text 獲取標簽的內容
5、 a.write(文件名)寫入文件
from xml.etree import ElementTree as ET a=ET.parse("first_xml") b=a.getroot() for i in b.iter("year"): new_year=int(i.text)+1 i.text=str(new_year) a.write("first_xml")
6、 標簽名.set("k1","k2") 為標簽添加屬性
7、 del 標簽名 attrib["k1"] 刪除標簽的屬性,如果標簽名無屬性,刪除報錯
3、創建一個XML文檔
方法1
from xml.etree import ElementTree as ET a=ET.Element("aaa") #創建根節點 b=ET.Element("bbb",{"k1":"k2"}) #創建子節點 c=ET.Element("ccc",{"k2":"k3"}) d=ET.Element("ddd",{"k3":"k4"}) a.append(b) b.append(c) c.append(d) #生成文檔對象 et = ET.ElementTree(a) *******#生成文檔對象******** et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)
方法2
from xml.etree import ElementTree as ET # 創建根節點 root = ET.Element("famliy") # 創建大兒子 # son1 = ET.Element(‘son‘, {‘name‘: ‘兒1‘}) son1 = root.makeelement(‘son‘, {‘name‘: ‘兒1‘}) # 創建小兒子 # son2 = ET.Element(‘son‘, {"name": ‘兒2‘}) son2 = root.makeelement(‘son‘, {"name": ‘兒2‘}) # 在大兒子中創建兩個孫子 # grandson1 = ET.Element(‘grandson‘, {‘name‘: ‘兒11‘}) grandson1 = son1.makeelement(‘grandson‘, {‘name‘: ‘兒11‘}) # grandson2 = ET.Element(‘grandson‘, {‘name‘: ‘兒12‘}) grandson2 = son1.makeelement(‘grandson‘, {‘name‘: ‘兒12‘}) son1.append(grandson1) son1.append(grandson2) # 把兒子添加到根節點中 root.append(son1) root.append(son1) #生成文檔對象 tree = ET.ElementTree(root) tree.write(‘oooo.xml‘,encoding=‘utf-8‘, short_empty_elements=False)
方法3
from xml.etree import ElementTree as f# 創建根節點 a=f.Element("QWE")# 創建兒子 b=f.SubElement(a,"asd",{"k1":"v1"})# 創建孫子 c=f.SubElement(b,"fgh",{"k2":"v2"}) #生成文檔對象 z=f.ElementTree(a) z.write("ad.xml",encoding="utf-8")
控制節點自閉合
short_empty_elements=False
加上節點不能自閉合 <grandson name="兒12"></grandson>
不加自閉合 <grandson name="兒12" />
註釋
xml_declaration=True
加上使xml文件有註釋 <?xml version=‘1.0‘ encoding=‘utf-8‘?>
由於原生保存的XML時默認無縮進,如果想要設置縮進的話, 需要修改保存方式:
from xml.etree import ElementTree as ET from xml.dom import minidom def prettify(elem): """將節點轉換成字符串,並添加縮進。 """ rough_string = ET.tostring(elem, ‘utf-8‘) reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent="\t") # 創建根節點 root = ET.Element("famliy") # 創建大兒子 # son1 = ET.Element(‘son‘, {‘name‘: ‘兒1‘}) son1 = root.makeelement(‘son‘, {‘name‘: ‘兒1‘}) # 創建小兒子 # son2 = ET.Element(‘son‘, {"name": ‘兒2‘}) son2 = root.makeelement(‘son‘, {"name": ‘兒2‘}) # 在大兒子中創建兩個孫子 # grandson1 = ET.Element(‘grandson‘, {‘name‘: ‘兒11‘}) grandson1 = son1.makeelement(‘grandson‘, {‘name‘: ‘兒11‘}) # grandson2 = ET.Element(‘grandson‘, {‘name‘: ‘兒12‘}) grandson2 = son1.makeelement(‘grandson‘, {‘name‘: ‘兒12‘}) son1.append(grandson1) son1.append(grandson2) # 把兒子添加到根節點中 root.append(son1) root.append(son1) raw_str = prettify(root) f = open("xxxoo.xml",‘w‘,encoding=‘utf-8‘) f.write(raw_str) f.close()
自己寫的
from xml.etree import ElementTree as f from xml.dom import minidom def prettify(elem): """將節點轉換成字符串,並添加縮進。 """ rough_string = f.tostring(elem, ‘utf-8‘) reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent="\t") a=f.Element("QWE") b=a.makeelement("asd",{"K1":"V2"}) c=a.makeelement("zxc",{"K1":"V2"}) a.set("name","lu") a.append(b) b.append(c) z=prettify(a) #轉成字符串了直接寫入 s=open("xxxx.xml","w") s.write(z) s.close()
xml中倆種解析方式