XML模块

XML模块

http操作

import requests
from xml.etree import ElementTree as ET  # 导入模块并重新命名为ET

# 验证qq在线状态
r = requests.get(
    'http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=725367')  # 发送get请求
a = r.text  # 拿到返回值

n = ET.XML(a)  # 获得xml格式对象(将返回值XML格式化)
if n.text == "Y":  # 获取标签中间的内容
    print("在线")
else:
    print("离线")

# 查看列车时刻表
r = requests.get(
    'http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
r = r.text  # # 拿到返回值
# print(r)
# 解析XML格式内容
n = ET.XML(r)  # 获得xml格式对象(将返回值XML格式化)
for i in n.iter('TrainDetailInfo'):
    print(i.find('TrainStation').text, i.find('StartTime').text, i.tag, i.attrib)
    # n.iter('TrainDetailInfo') 寻找节点:TrainDetailInfo = 标签名,寻找标签名叫 TrainDetailInfo 的节点
    # i.attrib  获取标签属性:
    # i.find('TrainStation')   寻找标签:
    # i.find('TrainStation').text   获取标签的内容


"""
西安北(车次:G666) 15: 58:00
TrainDetailInfo
{'{urn:schemas-microsoft-com:xml-msdata}rowOrder': '0',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo1',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}hasChanges': 'inserted'}
渭南北
16: 17:00
TrainDetailInfo
{'{urn:schemas-microsoft-com:xml-msdata}rowOrder': '1',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo2',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}hasChanges': 'inserted'}
三门峡南
17: 01:00
TrainDetailInfo
{'{urn:schemas-microsoft-com:xml-msdata}rowOrder': '2',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo3',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}hasChanges': 'inserted'}
洛阳龙门
17: 34:00
TrainDetailInfo
{'{urn:schemas-microsoft-com:xml-msdata}rowOrder': '3',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo4',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}hasChanges': 'inserted'}
郑州东
18: 20:00
TrainDetailInfo
{'{urn:schemas-microsoft-com:xml-msdata}rowOrder': '4',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo5',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}hasChanges': 'inserted'}
安阳东
19: 03:00
TrainDetailInfo
{'{urn:schemas-microsoft-com:xml-msdata}rowOrder': '5',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo6',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}hasChanges': 'inserted'}
邯郸东
19: 22:00
TrainDetailInfo
{'{urn:schemas-microsoft-com:xml-msdata}rowOrder': '6',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo7',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}hasChanges': 'inserted'}
石家庄
20: 11:00
TrainDetailInfo
{'{urn:schemas-microsoft-com:xml-msdata}rowOrder': '7',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo8',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}hasChanges': 'inserted'}
高碑店东
21: 01:00
TrainDetailInfo
{'{urn:schemas-microsoft-com:xml-msdata}rowOrder': '8',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo9',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}hasChanges': 'inserted'}
北京西
None
TrainDetailInfo
{'{urn:schemas-microsoft-com:xml-msdata}rowOrder': '9',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo10',
 '{urn:schemas-microsoft-com:xml-diffgram-v1}hasChanges': 'inserted'}
"""
print(n.tag)  # 获取根节点
# {http://WebXml.com.cn/}DataSet

 

文件操作

 1 from xml.etree import ElementTree as ET  # 导入模块并重新命名为ET
 2 
 3 # 方法1
 4 f = open("first.xml", "r", encoding='utf-8')
 5 
 6 r = ET.XML(f.read())
 7 
 8 # iter与find都是寻找的意思,iter用于寻找节点的标签,find用于寻找节点内的标签。
 9 for n2 in r.find('country'):
10     print(n2)
11     """
12     <Element 'rank' at 0x102220138>
13     <Element 'year' at 0x102220188>
14     <Element 'gdppc' at 0x1022201d8>
15     <Element 'neighbor' at 0x102220228>
16     <Element 'neighbor' at 0x102220278>
17     """
18 for n2 in r.iter('country'):
19     print(n2)
20     """
21     <Element 'country' at 0x102223908>
22     <Element 'country' at 0x1022202c8>
23     <Element 'country' at 0x102220458>
24     """
25 
26 # 方法2
27 r = ET.parse("first.xml")
28 tree_first = r.getroot()  # 获取父节点
29 # 修改
30 for i in tree_first.iter("year"):
31     new_year = int(i.text) + 1
32     i.text = str(new_year)  # 对xml进行更改(必须是str才能保存)
33     i.set("name", "renhang")
34     i.set("age", "19")
35     del i.attrib["name"]  # 删除属性,因为xml文件为字典,所以删除属性时用[]括号
36 # 删除
37 for i in tree_first.iter("country"):  # 循环父节点下的country子节点
38     rank = int(i.find("rank").text)  # 将rank节点的值转换为数字
39     if rank > 50:
40         tree_first.remove(i)  # 删除子节点
41 
42 r.write("first.xml")
43 # i.set(a, b) 为标签添加或修改属性(a、b必须是字符串,必须传递a、b两个参数)
44 
45 
46 # 创建xml文件
47 # 创建根节点
48 r = ET.Element("famliy")
49 
50 # 创建子节点
51 s1 = ET.Element('son', {'name': '儿1'})
52 s2 = ET.Element('son', {"name": '儿2'})
53 
54 g1 = ET.Element('grandson', {'name': '儿11'})
55 g2 = ET.Element('grandson', {'name': '儿12'})
56 g3 = ET.Element('grandson')
57 
58 # 将g1、g2两子节点分别添加到s1、s2两个子节点内,s1、s2为g1、g2的父节点
59 s1.append(g1)
60 s1.append(g2)
61 s1.append(g3)
62 
63 # 把s1、s2两个子节点添加到根节点中,r为s1、s2的父节点
64 r.append(s1)
65 r.append(s1)
66 
67 tree = ET.ElementTree(r)
68 tree.write('new.xml', encoding='utf-8', short_empty_elements=False,xml_declaration=True)

 

 

1、关于节点的结尾

节点中间有内容用标签开头标签结尾
    例:<g name="11>123</g>
节点中间无内容用标签开头用 /> 结尾
    例:<g name=“11” />

2、功能

tag    当前节点的标签名
attrib    当前节点的属性
text    当前节点的内容
makeelement(标签名,属性)    创建一个新节点
ElementTree.Element()    创建一个新节点
append(节点)    追加一个节点
getroot    获取根节点
write    将内存中的xml写入文件
extend()    追加多个节点
insert()    插入节点
remove()    移除某个
findtext()    获取正在寻找的节点的内容
findall()    获取全部子节点
iterfind()    获取指定的节点
clear    清空节点
get()    获取当前节点的属性值
set()    为当前节点设置属性
keys()    获取当前节点的所有属性的key
items()    获取当前字节的所有属性的值(键值对)   
iter()    获取当前节点的所有子节点(根据节点的名称寻找指定的节点)
itertext()    获取当前节点子所有节点的内容(根据节点的名称寻找指定的节点内容)

3、文件写入

    在最后吸入文件是,write()括号中可以加参数
    参数 short_empty_elements=False 可以对节点末尾强制用标签结尾
    参数 xml_declaration=True 给xml文件天剑注释,解释
from xml.etree import ElementTree as ET  # 导入模块并重新命名为ET
# 创建xml文件
# 创建根节点
r = ET.Element("famliy")

# 创建子节点
s1 = ET.Element('son', {'name': '儿1'})
s2 = ET.Element('son', {"name": '儿2'})

g1 = ET.Element('grandson', {'name': '儿11'})
g2 = ET.Element('grandson', {'name': '儿12'})
g3 = ET.Element('grandson')

# 将g1、g2两子节点分别添加到s1、s2两个子节点内,s1、s2为g1、g2的父节点
s1.append(g1)
s1.append(g2)
s1.append(g3)

# 把s1、s2两个子节点添加到根节点中,r为s1、s2的父节点
r.append(s1)
r.append(s1)

tree = ET.ElementTree(r)
tree.write('new.xml', encoding='utf-8', short_empty_elements=False, xml_declaration=True)
“”“
<?xml version='1.0' encoding='utf-8'?>
<family><son name="儿1"><grandson name="儿11"></grandson><grandson name="儿12"></grandson><grandson></grandson></son><son name="儿1"><grandson name="儿11"></grandson><grandson name="儿12"></grandson><grandson></grandson></son></family>
”“”

4、用“open”方法打开xml文件,只需要建一个xml对象,并将根节点传入,即可对xml文件进行更改

from xml.etree import ElementTree as ET  # 导入模块并重新命名为ET

# 用方法1更改xml文件
f = open("first.xml", "r", encoding='utf-8')

tree_first = ET.XML(f.read())  # 获取根节点

for i in tree_first.iter("year"):
    new_year = int(i.text) + 1
    i.text = str(new_year)  # 对xml进行更改(必须是str才能保存)
    i.set("name", "renhang")
    i.set("age", "19")
    del i.attrib["name"]  # 删除属性,因为xml文件为字典,所以删除属性时用[]括号
# 删除
for i in tree_first.iter("country"):  # 循环父节点下的country子节点
    rank = int(i.find("rank").text)  # 将rank节点的值转换为数字
    if rank > 50:
        tree_first.remove(i)  # 删除子节点

r = ET.ElementTree(tree_first)  # 新的xml对象(因为之前的才做都在内存,需要建一个对象才可以写入)
r.write("first.xml")
# i.set(a, b) 为标签添加或修改属性(a、b必须是字符串,必须传递a、b两个参数)

5、为增加美观度,可以用xml的minidom对其添加缩进

from xml.etree import ElementTree as ET  # 导入模块并重新命名为ET
from xml.dom import minidom

def prettify(tree):
    """
    美化,给xml文件添加缩进,
    :param tree: 将要进行转换的根节点
    :return: 
    """
    r = ET.tostring(tree, encoding="utf-8")  # 将根节点转换为字符串
    a = minidom.parseString(r)  # 将字符串转换为minidom对象
    return a.toprettyxml(indent="\t")


# 创建xml文件
# 创建根节点
r = ET.Element("family")

# 创建子节点
s1 = ET.Element('son', {'name': '儿1'})
s2 = ET.Element('son', {"name": '儿2'})

g1 = ET.Element('grandson', {'name': '儿11'})
g2 = ET.Element('grandson', {'name': '儿12'})
g3 = ET.Element('grandson')

# 将g1、g2两子节点分别添加到s1、s2两个子节点内,s1、s2为g1、g2的父节点
s1.append(g1)
s1.append(g2)
s1.append(g3)

# 把s1、s2两个子节点添加到根节点中,r为s1、s2的父节点
r.append(s1)
r.append(s1)

new_tree = prettify(r)
f = open("new.xml", "w", encoding='utf-8')
f.write(new_tree)
f.close()
'''
<?xml version="1.0" ?>
<family>
<son name="儿1">
<grandson name="儿11"/>
<grandson name="儿12"/>
<grandson/>
</son>
<son name="儿1">
<grandson name="儿11"/>
<grandson name="儿12"/>
<grandson/>
</son>
</family>
'''

6、可以用前缀来避免节点命名冲突(命名空间)

from xml.etree import ElementTree as ET  # 导入模块并重新命名为ET

ET.register_namespace('com', "http://www.company.com")  # com为前缀的简写,"http://www.company.com"为前缀

# 构建树结构
r = ET.Element("{http://www.company.com}STUFF")  # STUFF为标签名
s = ET.SubElement(r, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": "123"})
s.text = "STUFF EVERYWHERE!"

# 创建一个XML对象并将根节点传入
tree = ET.ElementTree(r)

tree.write("page.xml", xml_declaration=True, encoding='utf-8', method="xml")
''''
<?xml version='1.0' encoding='utf-8'?>
<com:STUFF xmlns:com="http://www.company.com">
    <com:MORE_STUFF com:hhh="123">STUFF EVERYWHERE!</com:MORE_STUFF>
</com:STUFF>
'''

7、创建XML文件的方法2:makeelement

from xml.etree import ElementTree as ET  # 导入模块并重新命名为ET
# 创建XML文件的方法2   makeelement
# 创建根节点
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)

8、创建XML文件的方法3:SubElement

from xml.etree import ElementTree as ET  # 导入模块并重新命名为ET

# 创建XML文件的方法3   SubElement
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)

posted @ 2017-03-30 11:00  Grisom  阅读(140)  评论(0编辑  收藏  举报