Xml文件的读写操作
XmlDecoment兼容2.0
XDocument是3.0之后新增的方式,而且操作起来要方便一些
public class 读写XML
{
/* 读写XML的方式
* 1.Dom[XmlDocument,XDocument]
* 文档对象模型,将xml文件整个读取到内存汇总,然后操作
* 可以把整个xml文档读取之后当做一个对象来操作
* 优点是操作方便
* 缺点是如果文件比较大的话,对内存是个比较大的开销
* XmlDocument对应的和xpath表达式一起使用
* XmlDocument可以兼容2.0
* 在System.Xml命名空间下
* XDocument对应的和Lambda表达式和扩展方法一起使用
* XDocument是3.0开始使用的
* 在System.Xml.Linq命名空间下
*
* 2.Sax
* 事件驱动,这个是JAVA中的,在.NET中使用XmlReader,XmlWriter
* 优点是可以操作大的文件
* 但是缺点是使用不方便,需要对每个节点进行判断操作
*
* 3.XmlSerializer
* Xml序列化器
* 把一个对象写入到xml文件的时候使用XmlSerializer会非常方便
*
* 4.Linq To Xml
* System.Xml.Linq,其实就是Dom
*
*/
/// <summary>
/// 读取XML
/// </summary>
public static void ReadXml()
{
#region 使用XDocument读取xml文件
Console.WriteLine("XDocument递归获取所有节点:");
//读取文件
XDocument xDom = XDocument.Load(@"C:\Users\Administrator\Desktop\test\练习用文件\xdom.xml");
//获取根节点
XElement xRoot = xDom.Root;
//输出
Console.WriteLine(xRoot.Name);
////这里输出的是根节点下面的所有的内容拼接的字符串
//Console.WriteLine(xRoot.Value);
//或者加载到一个TreeView下
//TreeNode rootNode = treeView1.Nodes.Add(xRoot.Name.ToString());
//递归加载所有的子节点
LoadXDocument(xRoot);
//或者递归加载到TreeView中
//LoadXDocument(xRoot, rootNode.Nodes);
//获取指定节点
Console.WriteLine("XDocument获取指定节点:");
//使用Lambda表达式获取指定的路径
//使用根节点来获取指定节点
IEnumerable<XElement> xeList = xRoot.Descendants("student").Where(x => x.Value == "盈盈");
foreach (XElement item in xeList)
{
//输出属性
Console.WriteLine(item.Attribute("id").Value);
Console.WriteLine(item.Name);
}
#endregion 使用XDocument读取xml文件
Console.WriteLine();
Console.WriteLine();
#region 使用XmlDocument读取xml文件
Console.WriteLine("XmlDocument递归获取所有节点:");
//创建一个XmlDocument对象
XmlDocument xmlDom = new XmlDocument();
//加载xml文件
xmlDom.Load(@"C:\Users\Administrator\Desktop\test\练习用文件\xmldom.xml");
//获取根节点
XmlElement xmlRoot = xmlDom.DocumentElement;
Console.WriteLine(xmlRoot.Name);
//递归加载所有的子节点
LoadXmlDocument(xmlRoot);
//获取指定节点
Console.WriteLine("XDocument获取指定节点:");
//根据节点名称获取
XmlNodeList xmlList = xmlDom.GetElementsByTagName("name");
foreach (XmlNode item in xmlList)
{
Console.WriteLine("{0}--{1}", item.Name.ToString(), "");
}
//根据ID属性获取
//xml中的ID是唯一的,是不能重复的
//所以使用GetElementById获取的只能是一个节点信息
//但是在使用ID获取的时候,需要有对应的文档声明,不然系统无法识别哪个属性是ID(ps:因为xml的任何属性名称都可以声明为ID)
//XmlElement xmlList2 = xmlDom.GetElementById("c01");
//Console.WriteLine(xmlList2.Name);
//Console.WriteLine(xmlList2.OuterXml);
//根据xpath表达式(路径表达式)获取指定的节点
#endregion 使用XmlDocument读取xml文件
}
/// <summary>
/// 直接输出
/// </summary>
/// <param name="xRoot"></param>
private static void LoadXDocument(XElement xRoot)
{
//获取该节点下的所有子元素
foreach (XElement item in xRoot.Elements())
{
////输出节点的名称
//Console.WriteLine(item.Name.ToString());
////输出节点内容
//Console.WriteLine(item.Value.ToString());
//如果当前节点是叶子节点
if (item.Elements().Count() == 0)
{
Console.WriteLine("{0}-{1}", item.Name, item.Value);
}
else
{
Console.WriteLine(item.Name.ToString());
LoadXDocument(item);
}
}
////获取该元素下的指定的子元素
//xRoot.Elements("name");
}
///// <summary>
///// 加载到TreeVieww
///// </summary>
///// <param name="xRoot"></param>
///// <param name="treeNodes"></param>
//private static void LoadXDocument(XElement xRoot, TreeNodeCollection treeNodes)
//{
// //获取该节点下的所有子元素
// foreach (XElement item in xRoot.Elements())
// {
// if (item.Elements().Count() == 0)
// {
// treeNodes.Nodes.Add("{0}-{1}", item.Name.ToString(), item.Value.ToString());
// }
// else
// {
// TreeNode treeNode treeNodes.Nodes.Add(item.Name.ToString());
// LoadXmlDocument(item,treeNode.Nodes);
// }
// }
//}
/// <summary>
/// 递归加载
/// </summary>
/// <param name="xmlRoot"></param>
private static void LoadXmlDocument(XmlElement xmlRoot)
{
//循环遍历
foreach (XmlNode item in xmlRoot.ChildNodes)
{
//在使用之前需要判断一下当前节点是什么类型的节点
if (item.NodeType == XmlNodeType.Element)
{
//如果当前节点是元素节点则输出
Console.WriteLine(item.Name);
//递归调用
LoadXmlDocument((XmlElement)item);
}
else if (item.NodeType == XmlNodeType.Text || item.NodeType == XmlNodeType.CDATA)
{
Console.WriteLine(item.InnerText);
}
}
}
/// <summary>
/// 写入XML
/// </summary>
public static void WriteXml()
{
//创建一个数据源
List<Student> list = new List<Student>();
list.Add(new Student() { Name = "盈盈", Age = 18, Gender = '女', Address = "北京" });
list.Add(new Student() { Name = "硕硕", Age = 2, Gender = '男', Address = "合肥" });
list.Add(new Student() { Name = "黄磊", Age = 99, Gender = '男', Address = "北京天安门城门楼" });
#region XmlDocument变成方式写入xml文件,这个是兼容2.0版本
//创建一个Dom对象
XmlDocument xmlDom = new XmlDocument();
//添加声明
XmlDeclaration xmlDeclaration = xmlDom.CreateXmlDeclaration("1.0", "utf-8", "yes");
//添加节点到Dom中
xmlDom.AppendChild(xmlDeclaration);
//开始把数据源添加到Dom中,添加一个跟节点school
XmlElement xmlRoot = xmlDom.CreateElement("school");
xmlDom.AppendChild(xmlRoot);
//添加一个节点class,这里如果有多个可以在增加一个循环
XmlElement xmlClass = xmlDom.CreateElement("class");
//添加一个名字为id的属性
XmlAttribute xmlAttribute = xmlDom.CreateAttribute("id");
xmlAttribute.Value = "c01";
xmlClass.Attributes.Append(xmlAttribute);
xmlRoot.AppendChild(xmlClass);
//循环添加student
foreach (Student item in list)
{
//创建一个student对象
XmlElement xmlStudent = xmlDom.CreateElement("student");
xmlClass.AppendChild(xmlStudent);
//添加student的属性
//name
XmlElement xmlName = xmlDom.CreateElement("name");
xmlName.InnerText = item.Name;
xmlStudent.AppendChild(xmlName);
//age
XmlElement xmlAge = xmlDom.CreateElement("age");
xmlAge.InnerText = item.Age.ToString();
xmlStudent.AppendChild(xmlAge);
//gender
XmlElement xmlGender = xmlDom.CreateElement("gender");
xmlGender.InnerText = item.Gender.ToString();
xmlStudent.AppendChild(xmlGender);
//address
XmlElement xmlAddress = xmlDom.CreateElement("address");
xmlAddress.InnerText = item.Address;
xmlStudent.AppendChild(xmlAddress);
}
//2.把构建的Dom写入xml文件
xmlDom.Save(@"C:\Users\Administrator\Desktop\test\练习用文件\xmldom.xml");
#endregion XmlDocument变成方式写入xml文件
#region XDocument写入xml文件,这是3.0版本开始有的方法
XDocument xDom = new XDocument();
//创建声明(这里也可以不写)
XDeclaration xDec = new XDeclaration("1.0", "utf-8", "yes");
xDom.Declaration = xDec;
//创建根节点
XElement xRoot = new XElement("school");
xDom.Add(xRoot);
//添加一个节点class
XElement xClassElement = new XElement("class");
xClassElement.SetAttributeValue("id", "c01");
xRoot.Add(xClassElement);
//循环添加student对象
foreach (Student item in list)
{
//添加student对象
XElement xStudent = new XElement("student");
xClassElement.Add(xStudent);
//添加student的属性
xStudent.SetElementValue("name", item.Name);
xStudent.SetElementValue("age", item.Age);
xStudent.SetElementValue("gender", item.Gender);
xStudent.SetElementValue("address", item.Address);
}
//保存Dom对象到文件
xDom.Save(@"C:\Users\Administrator\Desktop\test\练习用文件\xdom.xml");
#endregion XDocument写入xml文件,这是3.0版本开始有的方法
}
}
/// <summary>
/// 创建一个数据源的类
/// </summary>
public class Student
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
private string _address;
public string Address
{
get { return _address; }
set { _address = value; }
}
}