C# Xml Linq XDocument 基本操作 -- 重新学习

person.xml

<?xml version="1.0" encoding="utf-8"?>
<MyP>
  <P1>
    <Person id="cz001">
      <Name>张三</Name>
      <Age>18</Age>
    </Person>
    <Person id="cz002">
      <Name>李四</Name>
      <Age>19</Age>
    </Person>
    <Person id="cz003">
      <Name>王五</Name>
      <Age>20</Age>
    </Person>
  </P1>
  <P2>
    <Person>
      <Name>张三2</Name>
      <Age>18</Age>
    </Person>
    <Person>
      <Name>李四2</Name>
      <Age>19</Age>
    </Person>
    <Person>
      <Name>王五2</Name>
      <Age>20</Age>
    </Person>
  </P2>
</MyP>
View Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Xml操作
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //读取XML
            System.Xml.Linq.XDocument xdoc = System.Xml.Linq.XDocument.Load("person.xml");
            System.Xml.Linq.XElement xeRoot = xdoc.Root; //根节点 
            System.Xml.Linq.XElement xele = xeRoot.Element("P1").Element("Person"); //子节点
            MessageBox.Show("id=" + xele.Attribute("id").Value);  //cz001
            foreach (var ele in xele.Elements())
            {
                string str = string.Format("Name={0},Value={1}", ele.Name.ToString(), ele.Value);
                MessageBox.Show(str);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //*读取XML数据加载到treeView1列表中。
            //1、加载person.xml
            System.Xml.Linq.XDocument xdoc = System.Xml.Linq.XDocument.Load("person.xml");
            //2、获取根节点,MyP
            System.Xml.Linq.XElement xeRoot = xdoc.Root;
            //3、先把根节点添加到treeView1上
            TreeNode treeViewRoot = treeView1.Nodes.Add(xeRoot.Name.LocalName);
            //4、开始遍历所有的子节点,使用递归
            LoadTreeNodes(xeRoot, treeViewRoot);


            //*写入XML文件。
            //1、创建XML对象
            System.Xml.Linq.XDocument xdocument = new System.Xml.Linq.XDocument();
            //2、创建跟节点
            System.Xml.Linq.XElement eRoot = new System.Xml.Linq.XElement("根节点");
            //添加到xdoc中
            xdocument.Add(eRoot);
            //3、添加子节点
            System.Xml.Linq.XElement ele1 = new System.Xml.Linq.XElement("子节点1");
            ele1.Value = "内容1";
            eRoot.Add(ele1);
            //4、为ele1节点添加属性
            System.Xml.Linq.XAttribute attr = new System.Xml.Linq.XAttribute("url", "http://www.baidu.com");
            ele1.Add(attr);
            

            //5、快速添加子节点方法
            eRoot.SetElementValue("子节点2", "内容2");

            //6、快速添加属性
            ele1.SetAttributeValue("id", 12);

            //7、最后保存到文件,也可以写入到流中。
            xdocument.Save("123.xml");

        }

        private void LoadTreeNodes(System.Xml.Linq.XElement xeRoot, TreeNode treeViewRoot)
        {
            //把xeRoot下面的所有内容循环绑定treeView上
            foreach (System.Xml.Linq.XElement ele in xeRoot.Elements())
            {
                //判定子根节点下是否还有子节点
                if (ele.Elements().Count() > 0)
                {
                    TreeNode node = treeViewRoot.Nodes.Add(ele.Name.ToString());  //写入Name值
                    //获取节点上的属性方法
                    System.Xml.Linq.XAttribute attr = ele.Attribute("id");
                    if (attr != null)
                    {
                        node.Text += string.Format(" [{0}={1}]", attr.Name, attr.Value);
                    }
                    LoadTreeNodes(ele, node); //遍历循环
                }
                else
                {
                    treeViewRoot.Nodes.Add(ele.Value); //写入节点下的Value
                }
            }
        }
    }
}
View Code

重新学习xml操作和xml序列化

1、先了解下xml格式,并手动创建xml文件。

 1、XML只能有一个根节点。
 2、XML有开始标记就必须有结束标记。
 3、XML元素的属性值必须有引号。
 4、XML必须有结束标记,大小写必须跟开始标记一致。
 5、XML文件编码必须跟encoding指定编码要一致。

123.xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<hgx>
  <P1>
  <Person ID="h001">
    <Name>张三</Name>
    <Age>18</Age>
  </Person>
  <Person ID="h002">
    <Name>李四</Name>
    <Age>20</Age>
  </Person>
  </P1>
  <P2>
  <Person ID="h003">
    <Name>王五</Name>
    <Age>21</Age>
  </Person>
  <Person ID="h004">
    <Name>赵六</Name>
    <Age>25</Age>
  </Person>
  </P2>
</hgx>

2、通过XDocument类访问读取xml文件。

static void Main(string[] args)
{
    XDocument xDoc = XDocument.Load("123.xml"); //加载xml文件
    XElement root = xDoc.Root;  //获取根节点
            
    //通过递归,获取所有下面的子元素
    GetXElement(root);
    Console.ReadKey();
}

private static void GetXElement(XElement root)
{
    //返回IEnumerable接口的对象,都可以实现foreach循环遍历
    foreach (XElement element in root.Elements())
    {
        //递归
        if (element.Elements().Count() > 0)
        {
            Console.WriteLine(element.Name);
            GetXElement(element);
        }
        else
        {
            Console.WriteLine(element.Value);
        }
    }
}

3、将123.xml文件内容加载到TreeView控件中显示。

private void button1_Click(object sender, EventArgs e)
{
    XDocument xDoc = XDocument.Load("123.xml");
    XElement root = xDoc.Root; //获取根元素
    TreeNode treeNode = this.treeView1.Nodes.Add(root.Name.ToString());
    LoadNodes(root, treeNode);
}

private void LoadNodes(XElement root, TreeNode treeNode)
{
    foreach (XElement element in root.Elements())
    {
        if (element.Elements().Count() > 0)
        {
            TreeNode node = treeNode.Nodes.Add(element.Name.ToString());
            //获取属性
            foreach (XAttribute attr in element.Attributes())
            {
                node.Text += " [" + attr.Name.ToString() + "=" + attr.Value + "]";
            }
            LoadNodes(element, node);
        }
        else
        {
            TreeNode node = treeNode.Nodes.Add(element.Value);
        }
    }
}

4、写入xml操作

private void button2_Click(object sender, EventArgs e)
{
    //创建XML对象
    XDocument xDoc = new XDocument();
    //创建一个根节点
    XElement root = new XElement("Root");
    xDoc.Add(root); //将根节点加入到XML对象中
    //创建一个子节点
    XElement xele = new XElement("User");
    root.Add(xele);
    //添加属性
    XAttribute attr = new XAttribute("ID", 1);
    xele.Add(attr);
    xele.SetElementValue("Name", "张三");
    xele.SetElementValue("Age", "18");

    //保存xml文件
    xDoc.Save("User.xml");
}

User.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <User ID="1">
    <Name>张三</Name>
    <Age>18</Age>
  </User>
</Root>

5、xml序列化和反序列化操作

Person类:

public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }

    [XmlIgnore] //此属性不被序列化,System.Xml.Serialization.XmlIgnoreAttribute
    public bool Gender { get; set; }
}

xml序列化:

private void button3_Click(object sender, EventArgs e)
{
    List<Person> list = new List<Person>();
    Person p1 = new Person() { ID = 1, Name = "张三", Age = 18 };
    Person p2 = new Person() { ID = 2, Name = "李四", Age = 20 };
    list.Add(p1);
    list.Add(p2);

    //xml序列化,System.Xml.Serialization.XmlSerializer
    XmlSerializer xmlSer = new XmlSerializer(typeof(List<Person>));
    using (System.IO.FileStream fs = System.IO.File.OpenWrite("Person.xml"))
    {
        xmlSer.Serialize(fs, list);
    }
}

Person.xml文件:

<?xml version="1.0"?>
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Person>
    <ID>1</ID>
    <Name>张三</Name>
    <Age>18</Age>
  </Person>
  <Person>
    <ID>2</ID>
    <Name>李四</Name>
    <Age>20</Age>
  </Person>
</ArrayOfPerson>

xml反序列化:

private void button4_Click(object sender, EventArgs e)
{
    List<Person> list = new List<Person>();
    //xml反序列化
    XmlSerializer xmlSer = new XmlSerializer(typeof(List<Person>));
    using (System.IO.FileStream fs = System.IO.File.OpenRead("Person.xml"))
    {
        list = (List<Person>)xmlSer.Deserialize(fs); 
    }
            
    foreach (Person p in list)
    {
        MessageBox.Show(string.Format("ID:{0},Name:{1},Age:{2}", p.ID, p.Name, p.Age));
    }
}
原文地址:https://www.cnblogs.com/han1982/p/4072571.html