• Xml Document与 xml反序列化


    概念

    .net 支持Xml文档与.net 类之间无缝双向转换。当应用程序规模变大后,要想程序变得灵活,可配置元素也会变得越来越多。应用程序根据xml文档配置也就自然而然的事。本文的目的也就讲解xml文档与.net 对象通过xml标签的对应关系,以及xml序列化出现问题后如何解决。

    基本的序列化元素

    [XmlRoot(“ElementName”)]:对应xml文档的根元素.

    Xml Segment1

    <?xml version="1.0" encoding="utf-8" ?>
    
    <StudentCollection>
    
    </StudentCollection>

    对应的映射类:

    [XmlRoot("StudentCollection")]
    
        public class Student
    
        {
    
     
    
    }

     

    Xml Segement 2

    <?xml version="1.0" encoding="utf-8" ?>
    
    <customer>
    
    </customer>

    映射类

    [XmlRoot("customer")]
    
        public class Customer
    
        {
    
     
    
        }

    XmlRoot(“元素名称”):类上的XmlRoot标签指明了类映射到xml的根结点,标签中的名称就是xml文档中根节点的名称。

    [XmlElement(“ElementName”)]:映射到xml文档中元素。

    Xml Segment1

    <?xml version="1.0" encoding="utf-8" ?>
    
    <student>
    
      <age>30</age>
    
    </student>

     

    对应的映射类:

    [XmlRoot("student")]
    
        public class Student
    
        {
    
            [XmlElement("age",Type=typeof (Int32))]
    
            public int Age
    
            {
    
                get;
    
                set;
    
     
    
            }
    
        }


     

    <?xml version="1.0" encoding="utf-8" ?>
    
    <employee  age="30">
    
    </employee>

    [XmlAttribute(“AttributeName”)]:映射到xml文档中属性。

    Xml 文件Employee.xml

     

    对应的映射类:

    [XmlRoot("employee")]
    
        public class Employee
    
        {
    
            [XmlAttribute("age")]
    
            public string Age
    
            {
    
                get;
    
                set;
    
            }
    
        }

    Xml 解析:

    using (StreamReader sr = new StreamReader("Employee.xml"))
    
                {
    
                    XmlSerializer xmlSerializer = new XmlSerializer(typeof(Employee));
    
                    Employee stList = xmlSerializer.Deserialize(sr) as Employee;
    
                    Debug.Assert(stList == null);
    
                    Console.Read();
    
                }

    同时具有XmlElement 与 XmlAttribute

    <?xml version="1.0" encoding="utf-8" ?>
    
    <student id="1001">
    
      <age>10</age>
    
    </student>
    [XmlRoot("student")]
    
        public class Student
    
        {
    
            [XmlAttribute("id")]
    
            public string ID
    
            {
    
                get;
    
                set;
    
            }
    
            [XmlElement("age", Type = typeof(Int32))]
    
            public int Age
    
            {
    
                get;
    
                set;
    
            }
    
        }
    
     
    
     
    
    using (StreamReader sr = new StreamReader("Student.xml"))
    
                {
    
                    XmlSerializer xmlSerializer = new XmlSerializer(typeof(Student));
    
                    Student student = xmlSerializer.Deserialize(sr) as Student;
    
                }

     

    XmlAttayItem 与 XmlElement 以及XmlArray节点

    <?xml version="1.0" encoding="utf-8" ?>
    
    <studentList>
    
      <student>
    
        <id>1001</id>
    
        <age>23</age>
    
        <name>hbb0b01</name>
    
        <subjects>
    
          <subject name="math">
    
            <score>
    
              80
    
            </score>
    
          </subject>
    
          <subject name="english">
    
            <score>
    
              90
    
            </score>
    
          </subject>
    
        </subjects>
    
      </student>
    
      <student>
    
        <id>1002</id>
    
        <age>30</age>
    
        <name>hbb0b02</name>
    
        <subjects>
    
          <subject name="math">
    
            <score>
    
              70
    
            </score>
    
          </subject>
    
          <subject name="english">
    
            <score>
    
              60
    
            </score>
    
          </subject>
    
        </subjects>
    
      </student>
    
    </studentList>
    public class Subject
    
        {
    
            [XmlAttribute("name")]
    
            public string name
    
            {
    
                get;
    
                set;
    
            }
    
     
    
            [XmlElement("score")]
    
            public int score
    
            {
    
                get;
    
                set;
    
            }
    
        }
    
     
    
        public class Student
    
        {
    
            public string id
    
            {
    
                get;
    
                set;
    
            }
    
            public string name
    
            {
    
                get;
    
                set;
    
            }
    
            public int age
    
            {
    
                get;
    
                set;
    
            }
    
             /// <summary>
    
            /// subjects可以与xml节点的集合节点的名称不同,可以用
    
            /// XmlArray指定映射到的集合节点
    
            /// </summary>
    
            [XmlArrayItem(ElementName = "subject", Type = typeof(Subject))]
    
            [XmlArray("subjects")]
    
            public Subject[] subjects123
    
            {
    
                get;
    
                set;
    
            }
    
     
    
        }
    
     
    
    [XmlRoot("studentList")]
    
        public class StudentList
    
        {
    
            [XmlElement(ElementName = "student")]
    
            public List<Student> students
    
            {
    
                get;
    
                set;
    
            }
    
        }
    
     
    
    using (StreamReader sr = new StreamReader("StudentList.xml"))
    
                {
    
                    XmlSerializer xmlSerializer = new XmlSerializer(typeof(StudentList));
    
                    StudentList stList = xmlSerializer.Deserialize(sr) as StudentList;
    
                    Debug.Assert(stList == null);
    
                    Console.Read();
    
                }

    总结:

    至此最常用的xml标签XmlRoot,XmlAttribute,XmlElement,XmlArray,XmlArrayItem与类元素的映射关键已经讲完。

  • 相关阅读:
    Mysql数学函数不求人数据库专栏,MySQL
    下班以后就不要开电脑了,
    在ubuntu下用eclipsecdt调试memcached C language ITeye论坛
    mperham/sidekiq
    Reference C++ Reference
    请问一下哪有机械键盘的实体店可以体验一下? 外设 Chiphell 分享与交流用户体验的最佳平台 Powered by Discuz!
    Linux的cron和crontab iTech 博客园
    MIUI官方论坛 发烧友必刷的Android ROM
    机器学习视频
    crossover 海客谈, 季小军, 义乌人
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/2883683.html
Copyright © 2020-2023  润新知