• 列化复杂的xml对应的类


    你能帮我写一个序列化复杂的xml对应的类吗? c#代码

    好的,可以试着为一个复杂的XML生成对应的C#类。这里我就简单的XML为例:

    <Book>
      <Name>Design PatternsName>
      <Author>Erich GammaAuthor>
      <Pages>395Pages>
      <Chapters>
        <Chapter>
          <Title>IntroductionTitle>
          <Pages>20Pages> 
        Chapter>
        <Chapter>
           <Title>IteratorTitle>
           <Pages>25Pages>
        Chapter>
      Chapters>
    Book>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    针对上述XML,我们可以使用C#中的XML序列化特性生成类定义:

    using System.Xml.Serialization;
    
    [XmlRoot("Book")]
    public class Book {
    
      [XmlElement("Name")]
      public string Name {get; set;}
    
      [XmlElement("Author")]
      public string Author {get; set;}
    
      [XmlElement("Pages")]
      public int Pages {get; set;}
    
      [XmlArray("Chapters")]
      [XmlArrayItem("Chapter")]
      public List Chapters {get; set;}
    
    }
    
    public class Chapter {
    
      [XmlElement("Title")]
      public string Title {get; set;}
    
      [XmlElement("Pages")]
      public int Pages {get; set;}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    这里通过XmlRoot, XmlElement和XmlArray等特性,我们可以清晰的定义出XML与类的映射关系。

    如果XML结构更加复杂,包含更多层级关系,同样可以使用嵌套的类来表示,一步步建立起完整的对象模型。

    希望这个简单的示例可以帮助您对于XML和C#类之间的序列化和反序列化有个基本的了解。如果有更复杂的XML案例,我也可以尝试为您编写对应的C#类定义。

    包含属性的

    好的,对于包含属性的复杂XML,我们可以这样设计C#类的序列化代码:

    假设XML如下:

    <Person>
      <Name>JohnName>
      <Age>30Age>
      <Address>
        <Street>123 Main StStreet>
        <City>New YorkCity>
        <State code="NY">New YorkState>
      Address>
      <Contacts>
        <Contact type="email">john@example.comContact>
        <Contact type="phone">123-456-7890Contact>
      Contacts>
    Person>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    对应的C#类可以设计为:

    using System.Xml.Serialization;
    
    [XmlRoot("Person")]
    public class Person {
    
      [XmlElement("Name")]
      public string Name {get; set;}
    
      [XmlElement("Age")]
      public int Age {get; set;}
    
      [XmlElement("Address")]
      public Address Address {get; set;}
    
      [XmlArray("Contacts")]
      [XmlArrayItem("Contact")]
      public List Contacts {get; set;}
    
    }
    
    public class Address {
    
      [XmlElement("Street")]
      public string Street {get; set;}
    
      [XmlElement("City")]
      public string City {get; set;}
    
      [XmlElement("State")]
      public State State {get; set;}
    
    }
    
    public class State {
    
      [XmlAttribute("code")]
      public string Code {get; set;}
    
      [XmlText]
      public string Name {get; set;}
    
    }
    
    public class Contact {
    
      [XmlAttribute("type")]
      public string Type {get; set;}
    
      [XmlText]
      public string Value {get; set;}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    这里对于属性,我们可以通过XmlAttribute特性来进行标记和映射。

    同时使用嵌套类来表示复杂的层级关系。

    如果XML中还有其他如重复结构、命名空间等情况,都可以通过适当的特性和设计来实现序列化。

    具体的使用代码的例子

    好的,这里给出使用上述C#类对XML进行序列化和反序列化的完整代码示例:

    using System;
    using System.Xml.Serialization;
    
    namespace XmlSerializationDemo {
    
      public class Program {
    
        static void Main(string[] args) {
          
          // 将对象序列化为XML
          Person person = new Person();
          person.Name = "John";
          person.Age = 30;
    
          PersonAddress address = new PersonAddress();
          address.Street = "123 Main St";
          address.City = "New York";
          
          PersonState state = new PersonState();
          state.Code = "NY";
          state.Name = "New York";
          address.State = state;
    
          person.Address = address;
    
          XmlSerializer serializer = new XmlSerializer(typeof(Person));
          using (StringWriter writer = new StringWriter()) {
            serializer.Serialize(writer, person);
            string xml = writer.ToString();
            
            Console.WriteLine(xml);
          }
    
          // 从XML反序列化为对象  
          Person newPerson;
          using (StringReader reader = new StringReader(xml)) {
            newPerson = (Person)serializer.Deserialize(reader);
          }
    
          Console.WriteLine(newPerson.Name);
          Console.WriteLine(newPerson.Address.City);
        }
    
      }
    
      // 省略person类定义...
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    在这个示例中,我们:

    1. 创建了一个Person对象
    2. 使用XmlSerializer序列化为XML
    3. 然后再将XML反序列化回Person对象

    这样,就可以方便的实现XML和C#对象之间的相互转换。

    当然,还有其他更便捷的序列化方法,如Json.NET等。希望这个示例可以帮助您理解基本的用法。如果还有其他问题,欢迎指出。

  • 相关阅读:
    node 第十二天 npm补充 详解package-lock.json在团队协作中的作用
    JMeter压测如何分配业务比例?
    [附源码]Python计算机毕业设计SSM开放式在线课程教学与辅助平台(程序+LW)
    linux上如何搭建Java环境
    工业无线呼叫安灯(Andon)系统上线须知
    全光谱护眼灯有哪些?2023全光谱护眼台灯推荐
    网络基础—网关、网段、子网掩码
    游戏编程精粹2目录
    解密Prompt系列16. LLM对齐经验之数据越少越好?LTD & LIMA & AlpaGasus
    【openlayers】地图【二】
  • 原文地址:https://blog.csdn.net/wojiuguowei/article/details/132599792