• 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));
        }
    }
  • 相关阅读:
    分布式锁实战,分布式锁方案选择
    数据库索引调优技巧
    GraphQL
    PDF添加水印
    word添加水印,.NET执行宏
    『OpenCV』在Cmake中设置指定的OpenCV路径
    『论文笔记』ArcFace: Additive Angular Margin Loss for Deep Face Recognition
    Dapr微服务应用开发系列3:服务调用构件块
    ClearLinux安装教程
    tail命令学习实例
  • 原文地址:https://www.cnblogs.com/han1982/p/4072571.html
Copyright © 2020-2023  润新知