1. 程式人生 > >xml中倆種解析方式

xml中倆種解析方式

print source 想要 tree urn 由於 oot con 一個

兩種解析方式

技術分享

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中倆種解析方式