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
XML的格式

 

xml的特性

  • 标签是以一个<字符开头,上面例子中的<data>一样
  • 标签的结束是在跟了一段其他内容之后来结束标签用‘/’,例如上面中以<data>***</data>
  • 标签之间可以多级嵌套,例如country 就是他的子标签,rank又是country的子标签
  • 属性也就是上面中name就是country的属性
  • 标签中可以包含值 例如year中的值就是2023
  • 如果命名一个标签没有内容或者子标签 它会在右面的尖括号中添加斜杠,例如添加<age/>代表<age></age>是一样的

1、解析XML

#XML解析一
from  xml.etree import ElementTree as ET

str_net=open('newnew.xml','r').read()
# 打开文件,读取XML内容
root=ET.XML(str_net)
# 将字符串解析乘xml特殊对象,root代指xml文件的根节点
print(root)

  

#xml解析二
from xml.etree import ElementTree as ET
tree=ET.parse('newnew.xml') ##直接解析成xml文件
root=tree.getroot() ##获取xml的根节点
print(root.tag) ##顶层标签
for node in root:
    print(node.tag,node.attrib)
    ###第二次节点的标签名称和标签属性
    for i in node:
        print(i)
        ###循环获取下一层标签名称和内容

  

2、操作XML

当前节点的标签名
    tag = None
    """The element's name."""

    当前节点的属性

    attrib = None
    """Dictionary of the element's attributes."""

    当前节点的内容
    text = None

    def makeelement(self, tag, attrib):
        创建一个新节点
    ef append(self, subelement):
        为当前节点追加一个子节点

    def extend(self, elements):
        为当前节点扩展 n 个子节点

    def insert(self, index, subelement):
        在当前节点的子节点中插入某个节点,即:为当前节点创建子节点,然后插入指定位置
    def remove(self, subelement):
        在当前节点在子节点中删除某个节点
        """Remove matching subelement.
    def find(self, path, namespaces=None):
        获取第一个寻找到的子节点
        """Find first matching element by tag name or path.
     def findall(self, path, namespaces=None):
        获取所有的子节点
        """Find all matching subelements by tag name or path.
    def iterfind(self, path, namespaces=None):
        获取所有指定的节点,并创建一个迭代器(可以被for循环)
    def clear(self):
        清空节点
        """Reset element.
    def get(self, key, default=None):
        获取当前节点的属性值
    def set(self, key, value):
        为当前节点设置属性值
    def keys(self):
        获取当前节点的所有属性的 key
    def items(self):
        获取当前节点的所有属性值,每个属性都是一个键值对
        """Get element attributes as a sequence.
    def iter(self, tag=None):
        在当前节点的子孙中根据节点名称寻找所有指定的节点,并返回一个迭代器(可以被for循环)。
    def itertext(self):
        在当前节点的子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器(可以被for循环)。
节点操作

3.遍历xml文档的所有内容

from xml.etree import ElementTree as ET
tree=ET.parse('newnew.xml') ##直接解析成xml文件
root=tree.getroot() ##获取xml的根节点
print(root.tag) ##顶层标签
for node in root.iter('year'):
    print(node.tag,node.text)
    ###获取所有标签名称和值

4.修改节点内容

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

from xml.etree import ElementTree as TE

rat=TE.parse('newnew.xml')###直接解析XML文件
print(rat.getroot())    ###找到他的头文件
for i in rat.iter('year'):  ##循环找到他的‘year’的值
    kat=int(i.text)+1       ###转成整形,每次执行加1
    i.text=str(kat)         ###转成字符串形式放入
    print(i.text)           ###查看值
    i.set('kk','oo')       ###set是添加属性
    del  i.attrib['kk']   ###del删除属性
rat.write('newnew.xml')    ###写入文件


  5,删除节点

from xml.etree import ElementTree as ET

############ 解析字符串方式打开 ############

# 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').read()

# 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml)

############ 操作 ############

# 顶层标签
print(root.tag)

# 遍历data下的所有country节点
for country in root.findall('country'):
    # 获取每一个country节点下rank节点的内容
    rank = int(country.find('rank').text)

    if rank > 50:
        # 删除指定country节点
        root.remove(country)

############ 保存文件 ############
tree = ET.ElementTree(root)
tree.write("newnew.xml", encoding='utf-8')

  

创建xml文档

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(son1)

tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False

 第二种方式

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)

  第三种方式

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)

  

 由于原生保存的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()

 

posted on 2016-05-31 21:29  一个非常有趣的故事✨  阅读(229)  评论(0)    收藏  举报