0%

XML介绍和增删改查

什么是 XML

XML 指可扩展标记语言(eXtensible Markup Language)。

XML 被设计用来传输和存储数据 -> 仅关注数据本身

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>

XML 的树结构

我们这里给出实例和图片的对应关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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 树结构

XML 文档的声明(可选的)

1
<?xml version="1.0" encoding="UTF-8"?>

声明不是 xml 文档本身的一部分

XML 注意事项

  • XML 标签对大小写敏感
  • XML 必须正确地嵌套
  • XML 文档必须有根元素
  • XML 属性值必须加引号
  • 使用预定义的实体引用来代替 “<” 和 “&” 等特殊字符
&lt; < less than
&gt; > greater than
&amp; & ampersand
&apos; apostrophe
&quot; " quotation mark
  • XML 中的注释从 结束
  • XML 中的特殊字符必须被转义
  • XML 中的空格会被保留
  • XML 以 LF 存储换行
  • XML 元素名称可以包含字母、数字以及其他的字符
  • XML 元素名称不能以数字或者标点符号开始
  • XML 元素名称不能以字母 xml(或者 XML、Xml 等等)开始
  • XML 元素名称不能包含空格

XML 属性

1
<book category="CHILDREN">
  • 属性提供有关元素的额外信息
  • 属性始终在元素的开始标签中规定
  • 属性总是以名称/值的形式出现,比如:name=“value”
  • 属性值必须被引号包围,单引号和双引号都可以使用
  • 属性值必须是合法的 XML 数据类型
  • 属性不能包含多个值,不能折行

Unity 中 XML 的增删改查

新建文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.IO;
using System.Xml;
...
void CreateXML()
{
var localPath = UnityEngine.Application.dataPath + "/Resources/Data/" + "DeckData.xml";
if (!File.Exists(localPath))
{
XmlDocument xml = new XmlDocument();
XmlDeclaration xmldecl = xml.CreateXmlDeclaration("1.0", "UTF-8", "");//设置xml文件编码格式为UTF-8
XmlElement root = xml.CreateElement("Data");//创建根节点
xml.AppendChild(root);
xml.Save(localPath);//保存xml到路径位置
Debug.Log("创建XML成功!");
}
}

写入文件

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
public void WriteDeckDataToXML(string deckName,Dictionary<int,int> deckCards)
{
var localPath = UnityEngine.Application.dataPath + "/Resources/Data/" + "DeckData.xml";
if (File.Exists(localPath))
{
XmlDocument xml = new XmlDocument();
xml.Load(localPath);//加载xml文件
XmlNode root = xml.SelectSingleNode("Data");//获取根节点
if(root.HasChildNodes)//如果根节点有子节点(即有卡组数据
{
foreach (XmlNode node in root.ChildNodes)
{
if (node.Attributes["name"].Value == deckName)
{
root.RemoveChild(node);
}
}
}
XmlElement deck = xml.CreateElement("Deck");//创建子节点
deck.SetAttribute("name", deckName);//设置属性
foreach (var card in deckCards)
{
XmlElement cardElement = xml.CreateElement("Card");
cardElement.SetAttribute("id", card.Key.ToString());
cardElement.SetAttribute("count", card.Value.ToString());
deck.AppendChild(cardElement);
}
root.AppendChild(deck);
xml.Save(localPath);//保存xml到路径位置
}
}

读取文件

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
public void ReadDeckDataFromXML(string deckName)
{
foreach (var card in deckCards)
{
Debug.Log("card.Key: " + card.Key + "card.Value: " + card.Value);
}
Debug.Log("开始读取");
var localPath = UnityEngine.Application.dataPath + "/Resources/Data/" + "DeckData.xml";
if (File.Exists(localPath))
{
XmlDocument xml = new XmlDocument();
xml.Load(localPath);//加载xml文件
XmlNode root = xml.SelectSingleNode("Data");//获取根节点
if (root.HasChildNodes)//如果根节点有子节点(即有卡组数据
{
foreach (XmlNode node in root.ChildNodes)
{
if (node.Attributes["name"].Value == deckName)
{
foreach (XmlNode card in node.ChildNodes)
{
deckCards.Add(int.Parse(card.Attributes["id"].Value), int.Parse(card.Attributes["count"].Value));
}
}
}
}
}
foreach (var card in deckCards)
{
Debug.Log("card.Key: " + card.Key + "card.Value: " + card.Value);
}
Debug.Log("结束读取");

}

欢迎关注我的其它发布渠道