可以把XML的构造看成文件夹的关系,一个磁盘下有许多文件夹,这些文件夹的关系是并列的,一个文件夹下有许多文件。
一、Xml 文件的结构
1、头部文档说明
<?xml version="1.0" encoding="UTF-8"?>
其中 version="1.0" 代表了版本号为1.0 ,encoding="UTF-8" 代表了编码格式为UTF-8
2、根结点(每一个Xml都必须声明根元素,否则就会报错)
<学生名单>内容
</学生名单>
3、子结点
<姓名>网线</姓名>
个人觉得可以根据下面的图片来记忆Xml的结构(树的结构)
二、XML文件的操作方法
方法 | 用途 |
XmlDocument | 创建一个XMl文件对象 |
XmlDeclaration | 表示XML头部文档声明 |
XmlElement | 创建节点 |
XmlAttribute | 元素的属性 |
XmlNode | 单个结点 |
XmlText | 结点的内容 |
XmlComment | XML注释 |
三、XML文件的创建
//创建XML 文件的对象
XmlDocument doc = new XmlDocument();
//创建头部声明
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
//更新到对象中
doc.AppendChild(dec);
//创建根结点
XmlElement root = doc.CreateElement("学生名单");
//更新到对象中
doc.AppendChild(root);
//创建子结点
XmlElement student = doc.CreateElement("学生1");
//设置子结点的属性
student.SetAttribute("id", "1");
//student结点下面的子结点
XmlElement studentName = doc.CreateElement("姓名");
//结点的内容
XmlText xmltext = doc.CreateTextNode("网线");
//创建第二个子节点
XmlElement student1 = doc.CreateElement("学生2");
student1.SetAttribute("id", "2");
XmlElement studentName1 = doc.CreateElement("姓名");
XmlText xmltext1 = doc.CreateTextNode("小红");
//在结点之间建立连接
studentName1.AppendChild(xmltext1);
student1.AppendChild(studentName1);
studentName.AppendChild(xmltext);
student.AppendChild(studentName);
root.AppendChild(student);
root.AppendChild(student1);
//保存对象
doc.Save(@"F:\test.xml");
运行结果
<?xml version="1.0" encoding="utf-8"?>
<学生名单>
<学生1 id="1">
<姓名>网线</姓名>
</学生1>
<学生2 id="2">
<姓名>小红</姓名>
</学生2>
</学生名单>
四、 读取XML文件
对于XML读写有很多种方法,这里使用XmlDocument
//创建Xml对象
XmlDocument doc1 = new XmlDocument();
//加载XML文件
doc1.Load(@"F:\test.xml");
//获取根节点
XmlElement root1 = doc1.DocumentElement;
//获取Name为"学生1"子节点
XmlNodeList personNodes = root1.GetElementsByTagName("学生1");
foreach(XmlNode node in personNodes)
{
string id = ((XmlElement)node).GetAttribute("id");
string name = ((XmlElement)node).GetElementsByTagName("姓名")[0].InnerText;
Console.WriteLine("学生ID:{0},姓名{1}", id, name);
}
Console.ReadKey();
string xmlpath = @"F:\test.xml";
XmlDocument doc1 = new XmlDocument();
doc1.Load(xmlpath);
//筛选出特定路径下面的结点信息
XmlNode xmlnode = doc1.SelectSingleNode("/学生名单");
foreach (XmlElement xe in xmlnode)
{ //获取xe下面的全部子结点
foreach (XmlElement xxe in xe.ChildNodes)
{
if (xxe.Name == "姓名")
{
Console.WriteLine("{0}", xxe.InnerText);
}
}
}
Console.ReadKey();
五、向XML文件中插入新的子结点
找到插入结点的位置--->创建新的结点--->构造新的结点的属性和数据--->插入结点
string xmlpath = @"F:\test.xml";
XmlDocument doc1 = new XmlDocument();
doc1.Load(xmlpath);
XmlElement root1 = doc1.DocumentElement;
//创建结点
XmlElement student1 = doc1.CreateElement("学生4");
//赋值结点的属性
student1.SetAttribute("id", "4");
//创建子结点
XmlElement studentName1 = doc1.CreateElement("姓名");
XmlText xmltext = doc1.CreateTextNode("小明");
studentName1.AppendChild(xmltext);
//添加子结点
XmlElement studentNumber1 = doc1.CreateElement("学号");
XmlText xmltext2 = doc1.CreateTextNode("201702");
studentName1.AppendChild(xmltext2);
//赋值给根结点
student1.AppendChild(studentName1);
student1.AppendChild(studentNumber1);
root1.AppendChild(student1);
doc1.Save(xmlpath);
string xmlpath = @"F:\test.xml";
XmlDocument xmlDoc = new XmlDocument();
if (File.Exists(xmlpath))
{
xmlDoc.Load(xmlpath);
//读取学生名单结点
XmlNode memberlist = xmlDoc.SelectSingleNode("/学生名单");
//创建新的结点
XmlElement member = xmlDoc.CreateElement("MEMBER");
//给新结点添加属性
member.SetAttribute("AGE", "<29");
member.SetAttribute("SEX", "MAIL");
XmlElement lq = xmlDoc.CreateElement("NAME");
lq.InnerText = "六七";
member.AppendChild(lq);
memberlist.AppendChild(member);
xmlDoc.Save(xmlpath);
Console.WriteLine("添加成功");
}
else
{
Console.WriteLine("文件不存在");
}
六、删除XML的结点
string xmlpath = @"F:\test.xml";
XmlDocument doc = new XmlDocument();
doc.Load(xmlpath);
//删除学生名单结点所有的数据
XmlNode node = doc.SelectSingleNode("/学生名单");
XmlNodeList list = node.ChildNodes;
node.RemoveAll();
doc.Save(xmlpath);