XML 模块

XML
XML是实现不同语言或程序之间进行数据交换的协议,XML文件格式如下:
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2023</year>
        <gdppc>141100</gdppc>
        <neighbor direction="E" name="Austria" />
        <neighbor direction="W" name="Switzerland" />
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2026</year>
        <gdppc>59900</gdppc>
        <neighbor direction="N" name="Malaysia" />
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2026</year>
        <gdppc>13600</gdppc>
        <neighbor direction="W" name="Costa Rica" />
        <neighbor direction="E" name="Colombia" />
    </country>
</data>


1)、解析XML

@1.利用ElementTree.XML 将字符串解析成xml对象

from xml.etree import ElementTree as ET
#打开文件,读取XML内容
str_xml = open('xo.xml','r').read() #打开xo.xml文件给读的权限,并读取
#将字符串解析成xml特殊对象,root代指xml文件的根节点
root =  ET.XML(str_xml)



@2.利用ElementTree。parse将文件直接解析成xml对象
from xml.etree import ElementTree as ET
#直接解析xml文件
tree = ET.parse("xo.xml")
#获取xml文件的根节点
root = tree.getroot()



2)、操作XML
XML 格式类型是节点嵌套节点,对于每一个阶段均有以下功能,以便对当前结点进行操作:
class Element:
    当前结点的标签名:
    tag = None
    当前结点的属性
    attrib = None
    当前结点的内容
    text = None
    def __init__(self, tag, attrib={}, **extra):
        if not isinstance(attrib, dict):
            raise TypeError("attrib must be dict, not %s" % (
                attrib.__class__.__name__,))
        attrib = attrib.copy()
        attrib.update(extra)
        self.tag = tag
        self.attrib = attrib
        self._children = []
    def makeelement(self, tag, attrib):
        创建一个新节点
        return self.__class__(tag, attrib)
    def copy(self):
        .....
    def append(self,subelement):
        为当前节点追加一个子节点
    def extend(self, elements):
        为当前子节点扩展n个子节点
    def insert(self, index, subelement):
        在当前节点的子节点中插入某个节点,即为当前节点创建子节点,然后插入指定位置
    def remove(self, subelement):
        在当前节点在子节点中删除某个节点
    def find(self, path, namespaces=None):
        获取第一个寻找到的子节点
    def findtext(self, path, default=None, namespaces=None):
        获取第一个寻找到的子节点的内容
    def findall(self, path, namespaces=None):
        获取所有的子节点
    def iterfind(self, path, namespaces=None):
        获取所有指定的节点,并创建一个迭代器(可以被for循环)
    def clear(self):
        清空节点
    def get(self):
        获取当前节点的属性值
    def set(self, key, value):
        为当前节点设置属性值
    def keys(sekf):
        获取当前节点的所有属性的key
    def items(self):
        获取当前节点的所有属性值,每个属性值都是一个键值对
    def iter(self, tag=None):
        在当前节点的子孙中根据节点名称寻找所以指定的节点,并返回一个迭代器(可以被for循环)
    def getiterator(self, tag=None):
        .....
    def itertext(self):
        在当前节点的子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器(可以被for循环)





    #+++++++++++++++++++++++++++++++++++++++
    进行实例操作:
a、遍历XML文档的所有内容

for xml.etree import ElementTree as ET
*********解析方式一 ************
"""
#打开文件,读取XML内容
str_xml = open('xo.xml','r').read()
#将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml)

"""
由于这样太繁琐,而python有更加简洁的方式

*******解析方式二***************
tree = ET.parse("xo.xml")   #直接解析xml文件
root = tree.getroot()   #获取xml文件的根节点
###操作
print(root.tag)  #顶层标签

for child in root:#遍历XML文档的第二层
    print(child.tag, child.attrib)#第二层节点的标签名称和标签属性
    for i in child:  # 第二层节点的标签名称和内容
        print(i.tag, i.text)




    --------------------------
b)、遍历XML中指定的节点


from xml.etree import ElementTree as ET
***********解析方式一**********
"""
str_xml = open("xo.xml","r").read() #打开文件读取xml内容
root = ET.XML(str_xml) #将字符串解析成xml特殊对象,root代指xml文件的根节点

"""
************解析方式二************

tree = ET.parse("xo.xml")   #直接解析xml文件
root = tree.getroot()  #获取xml文件的根节点
###操作

print(root.tag)  #顶层标签
for node in root.iter('year'): #遍历XML中所有的year节点
    print(node.tag, node.text)  #节点的标签名称和内容



    --------------------------------
c)、修改节点内容
由于修改的节点时,均是在内存中进行,其不会影响文件中的内容。所以,如果想要修改,则需要重新将内存中的内容写到文件。

@1、解析字符串方式,修改,保存
    from xml.etree import ElementTree as ET
    *******解析方式一*********
    懒的写第一种方式了,困了***针对字符串(需要加上倒数第二句话)
    ********解析方式二*******针对文件
    tree = ET.parse("xo.xml")
    root = tree.getroot()
    print(root.tag)  #打印顶级标签
    for node in root.iter('year'):  #循环所有year节点
        new_year = int(node.text) + 1 将year节点中 的内容自增1
        node.text = str(new_year)
        #设置属性
        node.set('name','alex')
        node.set('age','18')

        del node.attrib['name']  #删除属性
    ********记得保存文件**********
    tree = ET.ElementTree(root)  #这一句适用于第一种解析方式,因为他的格式是字符串,而第二种方式是ElementTree,所以不在需要转换了,程度:******
    tree.write("newnew.xml", encoding="utf-8")



    -------------------------------------
d)、删除节点

from xml.etree import ElementTree as ET
**********解析字符串方式打开********
#打开文件,读取XML内容
str_xml = open('xo.xml','r').read()
#将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml)
**********解析文件方式打开**********
tree = ET.parse('xo.xml')  #直接解析xml文件
root = tree.getroot()   #获取解析xml文件

*********操作*****************
print(root.tar) #打印顶级标签
for cuntry in root.findall('country'): #遍历data下的所有country节点
    rank = int(country.find('rank').txt) #获取每一个country节点下rank节点的内容
    if rank > 50:
        root.remove(country)

*********保存文件***********
tree = ET.ElementTree(root) --如果是对字符串操作,就写这句,文件不用
tree.write("newnew.xml", encoding="utf-8")



#++++++++++++++++++++++++++++++++++++++++++++++++++++++
3、创建XML文档

@1)方法一:
from xml.etree import ElementTree as ET
root = ET.Element("famliy")  #创建根节点
son1 = ET.Element('son',{"name":'儿1'}) #创建节点大儿子
son2 = ET.Element('son', {"name":'儿2'})  #创建小儿子

在大儿子中创建两个孙子
grandson1 = ET.Element('grandson', {'name':"儿11"})
grandson2 = ET.Element('grandson', {'name': '儿12'})
son1.append(grandson1)
son1.append(grandson2)  #把两个孙子添加到大儿子中

#把大儿子添加到根节点中
root.append(son1)
root.append(son2)

tree = ET.ElementTree(root)
tree.write('oooo.xml', encoding='utf-8', 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 = ET.makeement('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(son2)
tree = ET.ElementTree(root)
tree.write('oooo.xml', encoding="utf-8", short_empty_element=False)



@3)、方法三:            -----------------------
from xml.etree import ElementTree as ET

root = ET.Element("famliy")  #创建根节点
创建节点大小儿子
son1 = ET.SubElement(root, "son", attrib={"name":"儿1"})
son2 = ET.SubElement(root, "son", attrib={"name":"儿2"})
创建大孙子
grandson1 = ET.SubElement(son1, "age", attrib={"name":"儿11"})
grandson1.text = '孙子'

et = ET.ElementTree(root)  #生成文档对象
et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)




@4)、方法4:           ----------------------------
由于原生保存的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.SubElement(root, "son", attrib={"name":"儿1"})
son2 = ET.SubElement(root, "son", attrib={"name":"儿2"})
创建大孙子
grandson1 = ET.SubElement(son1, "age", attrib={"name":"儿11"})
grandson1.text = '孙子'

raw_str = prettify(root)
f = open("xxoo.xml", "w", encoding="utf-8")
f.write(raw_str)
f.close()



@5)、命名空间
网址:http://www.w3school.com.cn/xml/xml_namespaces.asp
from xml.etree import ElementTree as ET

ET.register_namespace('com',"http://www.company.com") #some name

# build a tree structure
root = ET.Element("{http://www.company.com}STUFF")
body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": "123"})
body.text = "STUFF EVERYWHERE!"

# wrap it in an ElementTree instance, and save as XML
tree = ET.ElementTree(root)

tree.write("page.xml",
           xml_declaration=True,
           encoding='utf-8',
           method="xml")


#+++++++++++++++++++++++++++++++++++++++++++++++++++++++
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值