链条传动

砥砺前行,不忘初心!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
XML是不同语言或程序之间进行数据交换的协议
'''

'''
#利用ElementTree.XML将字符串解析成xml对象
from xml.etree import ElementTree as ET

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



#利用ElementTree.parse将文件直接解析成xml对象
from xml.etree import ElementTree as ET

# 直接解析xml文件
tree = ET.parse("test.xml")
# 获取xml文件的根节点
root = tree.getroot()
print(root)
print(root.tag)   #获取根节点的标签名
print(root.attrib)  #获取根节点的属性

#makeelement(self, tag, attrib)  创建一个新节点
#append(self, subelement)   当前节点追加一个子节点
extend(self, elements)     为当前节点扩展 n 个子节点
insert(self, index, subelement)   在当前节点的子节点中插入某个节点,即:为当前节点创建子节点,然后插入指定位置
remove(self, subelement)    在当前节点在子节点中删除某个节点
find(self, path, namespaces=None)    获取第一个寻找到的子节点
findtext(self, path, default=None, namespaces=None)  获取第一个寻找到的子节点的内容
findall(self, path, namespaces=None)  获取所有的子节点
iterfind(self, path, namespaces=None)  获取所有指定的节点,并创建一个迭代器(可以被for循环)
clear(self)  清空节点
get(self, key, default=None)  取当前节点的属性值
set(self, key, value)  为当前节点设置属性值
keys(self)  获取当前节点的所有属性的 key
items(self)  获取当前节点的所有属性值,每个属性都是一个键值对
iter(self, tag=None)  在当前节点的子孙中根据节点名称寻找所有指定的节点,并返回一个迭代器(可以被for循环)。
itertext(self)  在当前节点的子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器(可以被for循环)。

'''

'''
遍历XML文档的所有内容
利用ElementTree.parse将文件直接解析成xml对象
from xml.etree import ElementTree as ET

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

print(root.tag) #顶层标签


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

'''
遍历XML中指定节点
from xml.etree import ElementTree as ET

############ 解析方式一 ############
"""
# 打开文件,读取XML内容
str_xml = open('xo.xml', 'r').ReadMe.md()

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

# 直接解析xml文件
tree = ET.parse("xo.xml")

# 获取xml文件的根节点
root = tree.getroot()


### 操作

# 顶层标签
print(root.tag)


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

'''
修改节点内容
#解析字符串方式,修改,保存
from xml.etree import ElementTree as ET

############ 解析方式一 ############

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

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

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

# 顶层标签
print(root.tag)

# 循环所有的year节点
for node in root.iter('year'):
    # 将year节点中的内容自增一
    new_year = int(node.text) + 1
    node.text = str(new_year)

    # 设置属性
    node.set('name', 'alex')
    node.set('age', '18')
    # 删除属性
    del node.attrib['name']


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




#解析文件方式,修改,保存
from xml.etree import ElementTree as ET

############ 解析方式二 ############

# 直接解析xml文件
tree = ET.parse("xo.xml")

# 获取xml文件的根节点
root = tree.getroot()

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

# 顶层标签
print(root.tag)

# 循环所有的year节点
for node in root.iter('year'):
    # 将year节点中的内容自增一
    new_year = int(node.text) + 1
    node.text = str(new_year)

    # 设置属性
    node.set('name', 'alex')
    node.set('age', '18')
    # 删除属性
    del node.attrib['name']


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


'''

'''
删除节点
#解析字符串方式打开,删除,保存
from xml.etree import ElementTree as ET

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

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

# 将字符串解析成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')




#解析文件方式打开,删除,保存
from xml.etree import ElementTree as ET

############ 解析文件方式 ############

# 直接解析xml文件
tree = ET.parse("xo.xml")

# 获取xml文件的根节点
root = tree.getroot()

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

# 顶层标签
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.write("newnew.xml", encoding='utf-8')
'''

'''
添加节点、节点内容
from xml.etree import ElementTree as ET

tree = ET.parse('test.xml')
root = tree.getroot()

ele = ET.Element('aelx',{'k1':'v1'})   #创建一个节点,并指定其节点名和属性
ele.text = '添加内容'   #为节点设置内容
root.append(ele)   #把ele节点添加到根节点中

tree.write('xx.xml',encoding='utf-8')
'''

'''
创建XML
'''


from xml.etree import ElementTree as ET

root = ET.Element('family')   #创建一个根节点

#创建二级节点
son = ET.Element('son',{'name':'the sons'})
#其他两种节点创建方式
#son = root.makeelement('son',{'name':'the sons'})   #直接在根节点root中创建新节点son
#son = ET.SubElement(root,'son',{'name':'the sons'})  #先创建son节点,然后添加到root节点中
son.text = 'son'

girl = ET.Element('girl',{'name':'the girls'})
girl.text = 'girl'

#创建三级节点
grandson = ET.Element('grandson',{'name':'the grandsons'})
grandson.text = 'grandson'
grandgirl = ET.Element('grandgirl',{'name':'the grandgirls'})
grandgirl.text = 'grandgirl'

#将三级节点添加到二级节点中
son.append(grandson)
girl.append(grandgirl)

#将二级节点添加到根节点中
root.append(son)
root.append(girl)

#保存到XML文件(没有则新建)
# tree = ET.ElementTree(root)
# tree.write('new.xml',encoding='utf-8',short_empty_elements=False,xml_declaration=True)


#由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式
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进行缩进,然后再进行保存
with open('new.xml','w',encoding='utf-8') as f:
    new_root_str = prettify(root)
    f.write(new_root_str)

 

posted on 2016-11-04 14:02  链条君  阅读(479)  评论(0编辑  收藏  举报