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));
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM