XML简介

  • XML 指可扩展标记语言(EXtensible Markup Language)。
  • XML 是一种很像HTML的标记语言。
  • XML 的设计宗旨是传输数据,而不是显示数据。
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准。

XML 是独立于软件和硬件的信息传输工具。

XML 和 HTML 之间的差异

XML 不是 HTML 的替代。

XML 和 HTML 为不同的目的而设计:

  • XML 被设计用来传输和存储数据,其焦点是数据的内容。
  • HTML 被设计用来显示数据,其焦点是数据的外观。

HTML 旨在显示信息,而 XML 旨在传输信息。

下面实例是 Jani 写给 Tove 的便签,存储为 XML:

1
2
3
4
5
6
<note> 
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

上面的这条便签具有自我描述性。它包含了发送者和接受者的信息,同时拥有标题以及消息主体。

XML 树结构

XML 文档形成了一种树结构,它从”根部”开始,然后扩展到”枝叶”。

XML 文档使用简单的具有自我描述性的语法:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
  1. 第一行是 XML 声明。它定义 XML 的版本(1.0)和所使用的编码。
  2. 下一行描述文档的根元素
  3. 接下来 4 行描述根的 4 个子元素
  4. 最后一行定义根元素的结尾

XML 文档必须包含根元素。该元素是所有其他元素的父元素。

DOM node tree

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>

<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>

<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>

</bookstore>

XML 语法规则

  1. XML 文档必须有根元素

  2. XML 声明(可选)

    1
    <?xml version="1.0" encoding="utf-8"?>
  3. 所有的 XML 元素都必须有一个关闭标签

    HTML中某些元素不必有一个关闭标签
    在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签

  4. XML 标签对大小写敏感

  5. XML 必须正确嵌套

  6. XML 属性值必须加引号

    属性值用双引号 " 或单引号 ' 分隔,如果属性值中有单引号,则用双引号分隔;如果有双引号,则用单引号分隔。

  7. 实体引用

    实体引用 原符号 意义
    &lt; < less than
    &gt; > greater than
    &amp; & ampersand
    &apos; apostrophe
    &quot; quotation mark
    • 在 XML 中,其实只有字符 <&确实是非法的。
    • >号是合法的,但是用实体引用来代替它是一个好习惯。
  8. XML 中的注释 : 和HTML一样

    1
    <!-- This is a comment -->
  9. 在 XML 中,空格会被保留
    HTML 会把多个连续的空格字符裁减(合并)为一个,在 XML 中,文档中的空格不会被删减。

  10. XML 以 LF 存储换行

    • 在 Windows 应用程序中,换行通常以一对字符来存储:回车符(CR)和换行符(LF)。
    • 在 Unix 和 Mac OSX 中,使用 LF 来存储新行。
    • 在旧的 Mac 系统中,使用 CR 来存储新行。
    • XML 以 LF 存储换行。

XML 元素

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。

一个元素可以包含:

  • 其他元素
  • 文本
  • 属性
  • 或混合以上所有…

XML 元素的命名 : 名称不能以字母 xml(或者 XML、Xml 等等)开始

XML 属性

在 HTML 中,属性提供有关元素的额外信息:

1
2
<img src="computer.gif">
<a href="demo.html">

属性通常提供不属于数据组成部分的信息。在下面的实例中,文件类型与数据无关,但是对需要处理这个元素的软件来说却很重要:

1
<file type="gif">computer.gif</file>

下面两个代码都提供相同的信息。

1
2
3
4
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
1
2
3
4
5
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
  • 在 HTML 中,属性用起来很便利,但是在 XML 中,您应该尽量避免使用属性。
  • 最佳实践 :
    元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素

因使用属性而引起的一些问题:

  • 属性不能包含多个值(元素可以)
  • 属性不能包含树结构(元素可以)
  • 属性不容易扩展(为未来的变化)

XML 验证

合法的 XML 文档是”形式良好”的 XML 文档,这也符合文档类型定义(DTD)的规则:

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

python解析XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<students>  
<student no="2009081097">
<name nickname="apple">jack</name>
<gender>M</gender>
<age updated="yes">89</age>
<score subject="math">97</score>
<score subject="chinese">90</score>
</student>
<student no="2009081098">
<name nickname="apple">sunny</name>
<gender>W</gender>
<age updated="yes">90</age>
<score subject="math">87</score>
<score subject="chinese">96</score>
</student>
<student no="2009081099">
<name nickname="apple">Anna</name>
<gender>M</gender>
<age updated="yes">88</age>
<score subject="math">64</score>
<score subject="chinese">98</score>
</student>
</students>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
'''
ElementTree 生来就是为了处理 XML ,它在 Python 标准库中有两种实现。
一种是纯 Python 实现例如 xml.etree.ElementTree ,
另外一种是速度快一点的 xml.etree.cElementTree 。

你要记住: 尽量使用 C 语言实现的那种,因为它速度更快,而且消耗的内存更少。
一般使用下面的代码来导入。
'''
try:
import xml.etree.cElementTree as et
except ImportError:
import xml.etree.ElementTree as et

# 解析文件
parser = et.parse("data.xml")

# 获取根节点
root = parser.getroot()

# 获取标签名字
print(root.tag)

# 获取属性
attr = root.attrib

# 通过索引访问节点
print(root[0][0].text)

# 查找根目录下面的子元素
for name in root.findall("student"):
# 查找一个具体的元素
print(name.find("age").get("updated"))
#获取属性
print(name.get("no"))


#获取student元素
#更改student.age年龄
#获取name设置属性
#写入文档
for child in root.iter("student"):
new_age = int(child.find("age").text) + 10
child.find("age").text = str(new_age)
child.find("name").set("nickname","apple")
parser.write("data.xml")

#查找根目录下面的子元素
#查找age
#如果大于age删除元素
#写入文档
for offspring in root.findall("student"):
age = int(offspring.find("age").text)
if(age > 60):
root.remove(offspring)
parser.write("data.xml")

#创建元素
father = et.Element("father")
father.text = "Jason"
son = et.SubElement(father,"son")
son.text = "Lan"
daughter=et.SubElement(father,"daughter")
daughter.text = "sunny"
print(et.dump(father))
exit()

#迭代属性
for child in root:
print(("iterator node name is {} , attr is {}").format)(child.tag,child.attrib)

for student in root.findall('student'):
id = student.get("no")
name = student.find("name").text
print(id,name)

for age in root.iter('age'):
new_age = int(age.text)+1
age.text = str(new_age)
age.set('updated','yes')

#写入文件 用什么编码 是否要申明头部文件
parser.write("data.xml",encoding="utf-8",xml_declaration=True)

for name in root.iter("student"):
#print name.tag
print(name.attrib["no"])