什么是 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 文档的声明(可选的)
1
| <?xml version="1.0" encoding="UTF-8"?>
|
声明不是 xml 文档本身的一部分
XML 注意事项
- XML 标签对大小写敏感
- XML 必须正确地嵌套
- XML 文档必须有根元素
- XML 属性值必须加引号
- 使用预定义的实体引用来代替 “<” 和 “&” 等特殊字符
|
|
|
< |
< |
less than |
> |
> |
greater than |
& |
& |
ampersand |
' |
’ |
apostrophe |
" |
" |
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", ""); XmlElement root = xml.CreateElement("Data"); xml.AppendChild(root); xml.Save(localPath); 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); 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); } }
|
读取文件
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); 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("结束读取");
}
|