XML简介

  • XML 被设计用来传输和存储数据。
  • HTML 被设计用来显示数据。

在线网站

  • 万维网联盟 www.w3.org
  • 教程目录 w3.org/tutorials

什么是XML

  • Extensible Markup Language
  • 可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
  • 在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输

XML介绍(XML逐渐被Json替代)

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

XML简单实例

  • XML 不会做任何事情。XML被设计用来结构化、存储以及传输信息。
  • 下面实例是 Jani 写给 Tove 的便签,存储为 XML:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend !</body>
</note>
  • 上面的这条便签具有自我描述性。它包含了发送者和接受者的信息,同时拥有标题以及消息主体。
  • 但是,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。

XmlDocument

  • XmlDocument将XML视为树状结构,它装载XML文档,并在内存中构建该文档的树状结构。
  • 复制下面代码另存为.xml,在浏览器中查看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<root_CharacterTemplateData>
<CharacterTemplateData id="1000" name="法师">
<JobID>2</JobID>
<JobMode>Wizard</JobMode>
<InitForce>100</InitForce>
</CharacterTemplateData>
<CharacterTemplateData id="1001" name="战士">
<JobID>3</JobID>
<JobMode>Warrior</JobMode>
<InitForce>200</InitForce>
</CharacterTemplateData>
<CharacterTemplateData id="1002" name="农夫">
<JobID>4</JobID>
<JobMode>Farmer</JobMode>
<InitForce>20</InitForce>
</CharacterTemplateData>
</root_CharacterTemplateData>

创建XML(Unity)

引入命名空间

引入XML命名空间using System.Xml;

添加header和root节点

1
2
3
4
5
6
7
8
9
// xmlDocument实例
XmlDocument xmlDoc = new XmlDocument();
// Head 头部声明
XmlDeclaration header = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "");
xmlDoc.AppendChild(header);
//创建根节点<root_CharacterTemplateData>
XmlElement root = xmlDoc.CreateElement("root_CharacterTemplateData");
//添加根节点
xmlDoc.AppendChild(root);

添加一级节点

1
2
3
//创建一级子节点<CharacterTemplateData>
XmlElement e = xmlDoc.CreateElement("CharacterTemplateData" ) ;
root.AppendChild(e);

保存文件

1
2
3
4
5
6
7
8
9
10
private string fileName = "test.xml"; //文件名
public string filePath{ //保存路径
get
{
//Application.streamingAssetsPath
return Application.dataPath + "/" +fileName;
}
}
//保存到本地
xmlDoc.Save(filePath);

保存文件(Android)

1
2
3
4
5
6
7
8
9
10
11
private string fileName = "test.xml";//文件名
private string filePath{//保存路径
get
{
if (Application.platform == RuntimePlatform.Android)
return Application.persistentDataPath + "/" + fileName;
return Application.dataPath + "/" + fileName;
}
}
//保存到本地
xmlDoc.Save(filePath);

添加属性

1
2
3
4
5
6
7
//创建一级子节点<CharacterTemplateData>
XmlElement eleNew = xmlDoc.CreateElement("characterTemplateData");
root.AppendChild(eleNew);
//添加属性id id="1000"
eleNew.SetAttribute("id", "1000");
//添加属性name name="xml"
eleNew.SetAttribute("name", "xml");

添加二级节点

1
2
3
4
// 生成二级子节点 < JobID > 2 </ JobID >
XmlElement jobID = xmlDoc.CreateElement("JobID");//设置二级子节点的属性
jobID.InnerText = "2";//添加二级子节点
eleNew.AppendChild(jobID);

添加节点函数方法

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
private void AddElement(XmlDocument xmlDoc,XmlElement root,
string id, string name, string jobIDText)
{
//创建一级子节点<CharacterTemplateData
XmlElement eleNew = xmlDoc.CreateElement("characterTemplateData");
root.AppendChild(eleNew);
//添加属性id id="1000"
eleNew.SetAttribute("id", id);
//添加属性name name="xml"
eleNew.SetAttribute("name", name);
// 生成二级子节点 < JobID > 2 </ JobID >
XmlElement jobID = xmlDoc.CreateElement("JobID");
//设置二级子节点的属性
jobID.InnerText = jobIDText;
//添加二级子节点
eleNew.AppendChild(jobID);
//添加二级子节点<JobMode>none<JobMode>
//添加二级子节点<InitForce>1.1</InitForce>
}
```

## 批量添加节点

```c#
XmlDocument xmlDoc = new XmlDocument();
//添加头部信息
XmlDeclaration header = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "");
xmlDoc.AppendChild(header);
//创建根节点<root_CharacterTemplateData>
XmlElement root = xmlDoc.CreateElement("root_CharacterTemplateData");//添加根节点
xmlDoc.AppendChild(root);//创建一级子节点
AddElement(xmlDoc, root,"1000", "xml", "2");
AddElement(xmlDoc, root,"1001", "xmltest", "3");
AddElement(xmlDoc, root,"1002", "xmlssssss", "4");

添加XML(Unity)

异常处理:检测文件是否存在

  • 引入命名空间using System.IO;
1
2
3
4
5
6
//检测XML文件是否存在,如果不存在,直接返回
if (!File.Exists ( filePath ) )
{
Debug.LogError("请先执行创建XML");
return;
}

加载XML文件

1
2
3
4
5
6
// xmlDoc 实例
XmlDocument xmlDoc = new XmlDocument();
// 加载XML文件
xmlDoc.Load( filePath );
// 查看加载文件
Debug.Log( xmlDoc.InnerXml );

添加和保存文件

1
2
3
4
5
6
//获取根节点
XmlNode root = xmlDoc.SelectSingleNode("root_CharacterTemplateData");
//添加一级节点
AddElement(xmlDoc, root, "1003", "射手", "5", "Bow", 80);
//保存文件
xmlDoc.Save(filePath);

更新XML(Unity)

加载文件

1
2
3



获取和遍历根节点所有子节点

1
2
3



查找id为1002的节点

1
2
3



修改id和jobID

1
2
3



查找XML(Unity)

加载文件

1
2
3



获取和遍历根节点所有子节点

1
2
3



查找id为1000的节点

1
2
3



显示查找内容

1
2
3



删除XML(Unity)

遍历根节点所有子节点

查找id是1000的节点

删除属性和子节点

实例

1
2
3



- 2018学习笔记 - XML系列教程之一:XML教程.pdf