C#基础——XML文件的使用
语法规则
- XML 必须包含根元素,它是所有其他元素的父元素,如下中root既为根元素,若有声明需放在第一行。
<?xml version="1.0" encoding="utf-8"?>
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
(注:声明内容为:以上实例包含 XML 版本(UTF-8 也是 HTML5, CSS, JavaScript, PHP, 和 SQL 的默认编码。)
2. 必须有关闭标签
如下所示的,<></>为固定写法,必须配对出现
<root></root>
- 嵌套需要安装一定顺序 如下 上面那行为正确镶嵌顺序,下方为错误镶嵌顺序
`<root> <a> This true</a> </root> `
`<root> <a> This false </root> </a>`
- 如下图所示,在 XML 中,XML 的属性值必须加引号
第一个为错误的,第二个为正确写法
<note name=hahaha>
<to>Tove</to>
<from>Lisi</from>
</note>
<note name="hahaha">
<to>Tove</to>
<from>Lisi</from>
</note>
- 注释的使用,下图所示为注释的使用
<!-- This is a comment -->
6.实体引用
在 XML 中,一些字符拥有特殊的意义。
如果您把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。
这样会产生 XML 错误:
if salary < 1000 then
为了避免这个错误,请用实体引用来代替 “<” 字符:
if salary < 1000 then
在 XML 中,有 5 个预定义的实体引用:
注释:在 XML 中,只有字符 “<” 和 “&” 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。
7.空格保留问题
在 XML 中,文档中的空格不会被删减。使用了多少个空格,实际输出多少个空格
8. XML存储换行问题
在 Windows 应用程序中,换行通常以一对字符来存储:回车符(CR)和换行符(LF)。
在 Unix 和 Mac OSX 中,使用 LF 来存储新行。
在旧的 Mac 系统中,使用 CR 来存储新行。
XML 以 LF 存储换行。
实例:
XML 必须包含根元素,它是所有其他元素的父元素,比如以下实例中skills 就是根元素:
注:图片中xml技能信息表为为下文中TextFile1内容,自行改名,两者命名一致即可。
XML 配置文件内容 文件名为TextFile1
<skills>
<skill>
<id>2</id>
<name lang="cn">技能1</name>
<damage>130</damage>
</skill>
<skill>
<id>3</id>
<name lang="cn">技能2</name>
<damage>90</damage>
</skill>
<skill>
<id>4</id>
<name lang="cn">技能4</name>
<damage>400</damage>
</skill>
<skill>
<id>5</id>
<name lang="en">技能4</name>
<damage>30</damage>
</skill>
</skills>
自己的类 用来重写构造ToString
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Study_30_XML
{
class Skill
{
public int ID { get; set; }
public string Name { get; set; }
public string Lang { get; set; }
public int Damage { get; set; }
public override string ToString()
{
return string.Format("ID:"+ID+"Name:"+Name+"Lang:"+Lang+"Damage:"+Damage);
}
}
}
功能实现 内部含有解释
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
class Program {
static void Main(string[] args) {
//创建技能信息集合,用来存储所有的技能信息
List<Skill> skillList = new List<Skill>();
// XmlDocment专门用来解析xml文档的
XmlDocument xmlDoc = new XmlDocument();
//选择要加载解析的xml文档的名字
//xmlDoc.Load("xml技能信息.txt");
xmlDoc.LoadXml( File.ReadAllText("xml技能信息.txt") );//传递一个字符串(xml格式的字符串)
//得到根结点 (xmlnode用来代表一个结点)
XmlNode rootNode = xmlDoc.FirstChild;//获取第一个结点
//得到根结点下面的子节点的集合
XmlNodeList skillNodeList= rootNode.ChildNodes;//获取当前结点下面的所有子节点
foreach (XmlNode skillNode in skillNodeList)
{
Skill skill = new Skill();
XmlNodeList fieldNodeList = skillNode.ChildNodes;//获取skill结点下面所有的结点
foreach (XmlNode fieldNode in fieldNodeList)
{
if (fieldNode.Name == "id")//通过Name属性 可以获取一个结点的名字
{
int id = Int32.Parse(fieldNode.InnerText);//获取结点内部的文本
skill.Id = id;
}else if (fieldNode.Name == "name")
{
string name = fieldNode.InnerText;
skill.Name = name;
skill.Lang = fieldNode.Attributes[0].Value;
}
else
{
skill.Damage = Int32.Parse(fieldNode.InnerText);
}
}
skillList.Add(skill);
}
foreach (Skill skill in skillList)
{
Console.WriteLine(skill);
}
Console.ReadKey();
}
}
注:本文为作者记录XML使用方法,仅供学习使用.