添加数据
在往 XML 文件中添加数据时要先判断是否存在这个XML文件。
如果存在加载此文件,获得XML的根元素。
如果不存在则创建 XML,创建根节点。最后在根节点下添加数据。
-
File.Exists();
- 判断指定的文件是否存在。
-
Load(string filename);
- 从指定的 URL 加载 XML文档。
static void Main(string[] args)
{
// 追加 XML 文档
XmlDocument doc = new XmlDocument();
//文件路径
string path = @"D:\Web.xml";
// 根节点
XmlElement web = null;
// 判断是否存在
if (File.Exists(path))
{
// 如果文件存在, 加载 XML
doc.Load(path);
//获得文件的根节点
web = doc.DocumentElement;
Console.WriteLine("没有");
}
else
{
// 如果文件不存在 (创建)
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0","utf-8",null);
doc.AppendChild(dec);
// 创建根节点
web = doc.CreateElement("Web");
doc.AppendChild(web);
Console.WriteLine("创建了");
}
// 追加数据1
// 给根节点 Web 创建子节点
XmlElement item = doc.CreateElement("Item");
// 添加属性
item.SetAttribute("ID","1");
// 将 item 添加到根节点
web.AppendChild(item);
XmlElement name = doc.CreateElement("Name");
// 添加文本
name.InnerText = "高山";
// 将 name 添加到 item 节点
item.AppendChild(name);
XmlElement dir = doc.CreateElement("Dir");
// 添加文本
dir.InnerText = "http://blog.csdn.net/joinl";
// 将 dir 添加到 item 中
item.AppendChild(dir);
// 追加数据2
// 给根节点 Web 创建子节点
XmlElement item2 = doc.CreateElement("Item");
// 添加属性
item2.SetAttribute("ID", "2");
// 将 item 添加到根节点
web.AppendChild(item2);
XmlElement name2 = doc.CreateElement("Name");
// 添加文本
name2.InnerText = "CSDN";
// 将 name 添加到 item 节点
item2.AppendChild(name2);
XmlElement dir2 = doc.CreateElement("Dir");
// 添加文本
dir2.InnerText = "http://www.csdn.net";
// 将 dir 添加到 item 中
item2.AppendChild(dir2);
// 保存数据
doc.Save(@"D:\Web.xml");
Console.Read();
}
运行三次的结果(添加三次数据):
修改数据
在我们去 修改 数据时就要想到要 查找 到想要修改的那个数据,在做项目时就要想在满足什么样的条件下要修改什么数据,就是说当我们修改数据时必修有个对应的某个联系,不然就不知道修改的是哪个数据,查找的是哪个数据(有点绕口)。
例如下面这个XML文件:我们想要修改一个 Dir 里的内容,但在这里面有两个 Dir 内容也不一样,我们只想修改一个,从客户的角度上讲我希望我指定谁就可以修改谁,删除谁,添加谁。或者说指定一个范围内的修改删除添加。
满足某个条件的数据才可以进行删除修改添加。
这样一来我们就要去查找到所有的数据进行比较,满足条件的再进行修改等操作。废话有点多了,我们看看这个例子。
<?xml version="1.0" encoding="utf-8"?>
<Web>
<Item ID="1">
<Name>高山</Name>
<Dir>http://blog.csdn.net/joinl</Dir>
</Item>
<Item ID="2">
<Name>CSDN</Name>
<Dir>http://www.csdn.net</Dir>
</Item>
</Web>
上面是之前的 XML 文件 ,
/// <summary>
/// 更改 xml 数据
/// </summary>
/// <param name="path"> XML 文件路径</param>
/// <param name="id">ID属性的值 </param>
/// <param name="data"> 修改后的数据 </param>
public static void UpdateXml(string path,string id,string data)
{
XmlDocument doc = new XmlDocument();
XmlNode node = null;
// 在这里我就不啰嗦了、直接文件存下修改
if (File.Exists(path))
{
// 加载 XML
doc.Load(path);
// 获取根节点
node = doc.DocumentElement;
//还有一种方法获取
// 这个是选择文件的第一个节点 参数是节点的名字
// node = doc.SelectSingleNode("Web");
// 获取节点后获取根节点下的所有子节点,返回的是一个集合
XmlNodeList nodeList = node.ChildNodes;
// 把子节点遍历出来
for (int i = 0; i < nodeList.Count; i++)
{
// 判断条件,等于我们传进来的参数 id 属性 的修改下面的子节点 Dir 内容
if (nodeList[i].Attributes["ID"].Value == id)
{
// 寻找到这个节点后 再查找这个节点下的子节点 ,
for (int j = 0; j < nodeList[i].ChildNodes.Count; j++)
{
// 判断节点的名字是否一致,相等就修改此节点内的内容
if (nodeList[i].ChildNodes[j].Name == "Dir")
{
// 修改
nodeList[i].ChildNodes[j].InnerText = data;
// 修改完成后别忘了保存
doc.Save(path);
Console.WriteLine("修改成功");
}
}
}
}
Console.ReadKey();
}
}
我们调用一下上面的代码:
static void Main(string[] args)
{
string path = @"D:\Web.xml";
UpdateXml(path, "1", "http://download.csdn.net/detail/joinl/9845762");
}
运行结果:
删除数据
删除和上面类似,废话少说:
/// <summary>
/// 删除 xml 数据
/// </summary>
/// <param name="path"></param>
/// <param name="id"></param>
public static void DeleteXml(string path, string id)
{
XmlDocument doc = new XmlDocument();
XmlNode node;
if (File.Exists(path))
{
doc.Load(path);
// 选择单一的节点
node = doc.SelectSingleNode("Web");
XmlNodeList nodeList = node.ChildNodes;
for (int i = 0; i < nodeList.Count; i++)
{
if (nodeList[i].Attributes["ID"].Value == id)
{
// 移除 当前节点的所有子节点和属性
nodeList[i].RemoveAll();
doc.Save(path);
Console.WriteLine("删除成功");
}
}
}
}
调用:
static void Main(string[] args)
{
string path = @"D:\Web.xml";
DeleteXml(path, "2");
}
运行结果:
这里要注意一下,由上面的运行结果可以看出 ,属性 ID 为 2 的节点下面的子节点都被移除了,但是< Item >这个节点并没有移除,再运行时就会报一个错误:
我们也想要把此节点移除掉,该怎么做呢?
在我们移除节点数据时,可以使用另一个方法移除,该方法可以移除指定的节点本身,及其子节点。还是以此 XML 文件为例:
<?xml version="1.0" encoding="utf-8"?>
<Web>
<Item ID="1">
<Name>高山</Name>
<Dir>http://download.csdn.net/detail/joinl/9845762</Dir>
</Item>
<Item ID="2">
<Name>CSDN</Name>
<Dir>http://www.csdn.net</Dir>
</Item>
</Web>
// 移除 当前节点的所有子节点和属性
// nodeList[i].RemoveAll();
// ParentNode 获取父节点,RemoveChild 移除指定的子节点
nodeList[i].ParentNode.RemoveChild(nodeList[i]);
doc.Save(path);
运行结果:
改查
改查其实和上面都一样就不多说了,改无非就是找到数据,直接给数据赋值操作。查就是满足某个条件把数据显示出来。
一些重要方法属性
-
1 . XmlNode.SelectSingleNode(string xpath);
- 选择匹配Xpath 表达式的第一个 XmlNode;也就是参数为节点的名字,可以用 / 查找下面的子节点名字。
-
2. XmlDociment.DocumentElement{get;}
- 获取文档的跟 XmlElement。
-
3 . XmlNode.SelectSingleNode(string xpath);
- 选择匹配 xpath 表达式的第一个节点。
-
4. XmlNode.ChildNodes{get;}
- 属性;获取节点的所有子节点。返回一个集合。
-
5 . XmlNode.ParentNode{get;}
- 属性;获取该节点的父级节点。
-
6 . XmlNode.HasChildNodes{get;}
- 属性;获取一个值,该值指示节点是否有任何子节点;注意如果该节点内有文本内容,会返回 True 。
-
7 . XmlNode.Attributes{get;}
- 获取一个 XmlAttributeCollection (这个类表示可以按名称或索引访问的属性的集合。)就是说可以指定名称或索引获取某个属性。
-
8 . XmlNode.RemoveAll();
- 移除当前节点的所有子节点和/或特性。
-
9 . XmlNode.RemoveChild(XmlNode oldChild);
- 移除指定的子节点。
http://download.csdn.net/detail/joinl/9845762 可下载Unity安卓 XML存储读取系统用于学习,里面有增删改查,对应四个脚本方便学习,如有错误请及时指出,谢谢。本人是C#、Unity3D爱好者可以加我进行交流共同进步学习QQ:23313844。(请加备注)当然喜欢动漫和游戏的也可以加我,本人也是一位动漫迷和游戏迷。
知识点
为什么要获得根节点,创建根节点呢?上次已经说过XML文档必须有且只能有一个根节点
最后添加完数据别忘了在保存数据。(Save())