• XML序列化CDATA


    不可避免的遇到对接需要使用XML文档的第三方系统,某些节点内容特殊,序列化时需特殊处理,解决方案是实现IXmlSerializable接口。

    /// <summary>
        /// Person
        /// </summary>
        public class Person : IXmlSerializable
        {
            /// <summary>
            /// PersonId
            /// </summary>
            public int PersonId { get; set; }
            /// <summary>
            /// PersonName
            /// </summary>
            public string PersonName { get; set; }
            /// <summary>
            /// Birthday
            /// </summary>
            public DateTime? Birthday { get; set; }
            /// <summary>
            /// Age
            /// </summary>
            public int Age { get; set; }
            /// <summary>
            /// Remarks
            /// </summary>
            public string Remarks { get; set; }
    
            public XmlSchema GetSchema()
            {
                return default(XmlSchema);
            }
    
            public void ReadXml(XmlReader reader)
            {
                reader.ReadStartElement("Person");
                this.PersonId = reader.ReadElementContentAsInt("PersonId","");
                this.PersonName = reader.ReadElementContentAsString("PersonName","");
                this.Birthday = reader.ReadElementContentAsDateTime("Birthday", "");
                this.Age = reader.ReadElementContentAsInt("Age", "");
                this.Remarks = reader.ReadElementContentAsString("Remarks", "");
            }
    
            public void WriteXml(XmlWriter writer)
            {
                writer.WriteStartElement(nameof(this.PersonId));
                writer.WriteValue(this.PersonId);
                writer.WriteEndElement();
    
                writer.WriteStartElement(nameof(this.PersonName));
                writer.WriteCData(this.PersonName);
                writer.WriteEndElement();
    
                writer.WriteStartElement(nameof(this.Birthday));
                writer.WriteValue(this.Birthday);
                writer.WriteEndElement();
    
                writer.WriteStartElement(nameof(this.Age));
                writer.WriteValue(this.Age);
                writer.WriteEndElement();
    
                writer.WriteStartElement(nameof(this.Remarks));
                writer.WriteCData(this.Remarks);
                writer.WriteEndElement();
    
        
            }
        }

    序列化:

           XmlSerializer serializer = new XmlSerializer(typeof(Person));
    
                Person person = new Person();
                person.PersonId = 1;
                person.PersonName = chinesenames[0];
                person.Birthday = RandomUtils.RandomDateTime(DateTime.Now.AddYears(-40), DateTime.Now);
                person.Age = DateTime.Now.Year - person.Birthday.GetValueOrDefault().Year;
                person.Remarks = "https://blog.csdn.net/shuliuzh/article/details/49426711";
    
                using(MemoryStream writer=new MemoryStream())
                {
                    serializer.Serialize(writer, person);
                   string xml= Encoding.UTF8.GetString(writer.GetBuffer());
                    Console.WriteLine(xml);
                    File.WriteAllText("person.xml", xml, Encoding.UTF8);
                }

    结果:

    <?xml version="1.0"?>
    <Person>
      <PersonId>1</PersonId>
      <PersonName><![CDATA[闾丘寇态]]></PersonName>
      <Birthday>1985-05-24T00:00:00</Birthday>
      <Age>33</Age>
      <Remarks><![CDATA[https://blog.csdn.net/shuliuzh/article/details/49426711]]></Remarks>
    </Person>
  • 相关阅读:
    Oracle不常用SQL
    C# xml 读xml、写xml、Xpath、Xml to Linq、xml添加节点 xml修改节点
    Oracle常见错误:ORA-06550、ORA-00911、ORA-02085
    IIS设置允许跨域
    npm和yarn 切换为国内镜像(淘宝镜像)
    Wordpress 所有 hook 钩子
    【C#】WPF多线程登录需求中报错 “调用线程无法访问对象,因为另一个线程拥有该对象“
    【C#】 WPF 中WebBrowser拖动来移动窗口,改变窗口位置
    【Java】Hibernate一级缓存测试分析
    javac编译单文件、多文件引入jar包、-cp解决无法加载主类问题
  • 原文地址:https://www.cnblogs.com/shya/p/8902850.html
Copyright © 2020-2023  润新知