C#操作xml主要有这么几个对象:XmlDocument、XmlElement、XmlNode
命名空间:
using System.Xml;
知识补充:
XmlNode和XmlElement的区别:
1、Element是一个小范围的定义,必须含有完整信息的节点才能叫做元素。
2、Node是基本对象,Attribute、Element、Text等都是Node的子对象。
一个元素一定是一个节点,而一个节点不一定是元素。
XmlElement与XmlNode之间的继承关系如下:
..::.Object
System.Xml..::.XmlNode System.Xml..::.XmlLinkedNode System.Xml..::.XmlElement
体现在属性和方法中:
XmlNode有属性 - ChildNodes(XmlNodeList类型),而XmlElement则没有
XmlElement有方法 - GetAttribute、SetAttribute()等方法,而XmlNode则没有
(注意:两者都有Attribute属性)
因此,有些时候需要进行两者间的转换,以实现不同的功能。
主要方法以及属性介绍:
CreateElement():创建 XmlElement
有一个参数,两个参数,三个参数三种重载,参数类型均为string
一个参数:CreateElement("元素名称")
两个参数:CreateElement("元素名称","元素的命名空间")
三个参数:CreateElement("元素的前缀","元素的名称","元素的命名空间")
选择匹配 XPath 表达式的第一个 XmlNode
public XmlNode SelectSingleNode(
string xpath
)
XmlDocument::Save():将 XML 文档保存到指定的位置
XmlDocument::Load():加载指定的 XML 数据
获取文档的根 XmlElement
(6) XmlElement::SetAttribute():设置具有指定名称的属性的值
相对的有:GetAttribute():获取具有指定名称的属性的值
点添加到该节点的子节点列表的末尾
XmlElement也继承了该方法
“for each”样式迭代的支持。
同样,XmlElement也继承了该方法,所以也可用于"for each"迭代
实例代码:
XML文档的几个简单操作:
最终实现的XML内容如下所示:
其中:
“user”是xml文件的根节点;
两个"person"节点是"user"节点的子节点;
"person"节点有三个属性:"name", "sex", "age";
"pass"和"address"是"person"节点的两个子节点
(1) 增加声明段落:
[csharp]
1. XmlDocument xmldoc = new XmlDocument();
2. //加入XML的声明段落,<?xmlversion="1.0" encoding="gb2312"?>
3. XmlDeclaration xmldecl;
4. xmldecl = xmldoc.CreateXmlDeclaration("1.0","gb2312", null);
5. xmldoc.AppendChild(xmldecl);
(2) 加入根元素
[csharp]
1. private void CreateRootElement()
2. {
3. new XmlDocument();
4. "user");
5. xmlDoc.AppendChild(xmlelem);
6.
7. //保存创建好的XML文档
8. "User.xml");
9. }
(3) 装载XML文件
[csharp]
1. //load xml file
2. private void LoadXml()
3. {
4. if (isFileExisted == false)
5. {
6. new XmlDocument();
7. CreateRootElement();
8. true;
9. return;
10. }
11. new XmlDocument();
12. "User.xml");
13. }
(4) 增加新元素
[csharp]
1. //添加节点
2. public void AddElement(string name, string sex, string age, string pass, string address)
3. {
4. //装载Xml文件
5. LoadXml();
6. //获取根节点
7. "user");
8.
9. //创建元素Person
10. "person");
11.
12. //person节点的三个属性
13. "name", name);
14. "sex", sex);
15. "age", age);
16.
17. //创建一个新的元素
18. "pass");
19. //设置节点的串联值
20. passElement.InnerText = pass;
21. //将新创建的节点pass添加为person节点的子节点
22. personElement.AppendChild(passElement);
23.
24. "Address");
25. addrElement.InnerText = address;
26. personElement.AppendChild(addrElement);
27.
28. //添加person节点
29. xmldocSelect.AppendChild(personElement);
30. "user.xml");
31. }
(5) 输出xml文档内容:
(用了两种遍历方式:XmlNode,XmlElement)
[csharp]
1. //输出xml文档
2. public void showXml()
3. {
4. LoadXml();
5. //获取根节点
6. XmlElement rootElement = xmlDoc.DocumentElement;
7.
8. //挨个查找其下的子节点
9. foreach (XmlElement childElement in rootElement)
10. {
11. //分别输出子节点属性
12. "name"));
13. "sex"));
14. "age"));
15.
16. //获取孙节点列表
17. XmlNodeList grandsonNodes = childElement.ChildNodes;
18. foreach (XmlNode grandsonNode in grandsonNodes)
19. {
20. //显示孙节点文本
21. Console.WriteLine(grandsonNode.InnerText);
22. }
23. }
24. }
(6) 查找并修改节点
[csharp]
1. //修改节点
2. public void UpdateElement(string name)
3. {
4. LoadXml();
5. //获取根节点的所有子节点
6. "user").ChildNodes;
7.
8. foreach(XmlNode childNode in nodeList)
9. {
10. XmlElement childElement = (XmlElement)childNode;
11.
12. //如果找到姓名为name的节点
13. if (childElement.GetAttribute("name") == name)
14. {
15. "name","BYH");
16.
17. //如果下面有子节点在下走
18. XmlNodeList grandsonNodes = childElement.ChildNodes;
19. //继续获取xe子节点的所有子节点
20. foreach (XmlNode grandsonNode in grandsonNodes)
21. {
22. XmlElement grandsonElement = (XmlElement)grandsonNode;
23. //如果找到节点名为pass的孙子节点
24. if (grandsonElement.Name == "pass")
25. {
26. "66666";
27. break;
28. }
29. }
30. break;
31. }
32. }
33. "user.xml");
34. }
(7) 查找并删除节点
[csharp]
1. public void deleteNode(string name)
2. {
3. LoadXml();
4. //获取根节点的所有子节点
5. "user").ChildNodes;
6.
7. foreach (XmlNode childNode in childNodes)
8. {
9. XmlElement childElement = (XmlElement)childNode;
10. if (childElement.GetAttribute("name") == name)
11. {
12. //删除name属性
13. "name");
14. //删除该节点的全部内容
15. childElement.RemoveAll();
16.
17. break;
18. }
19. }
20.
21. "user.xml");
22. }