惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
U
Unit 42
MyScale Blog
MyScale Blog
B
Blog
阮一峰的网络日志
阮一峰的网络日志
量子位
IT之家
IT之家
The GitHub Blog
The GitHub Blog
F
Fortinet All Blogs
Recent Announcements
Recent Announcements
V
Visual Studio Blog
G
Google Developers Blog
Last Week in AI
Last Week in AI
雷峰网
雷峰网
博客园 - 聂微东
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
博客园 - 司徒正美
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
月光博客
月光博客
aimingoo的专栏
aimingoo的专栏

博客园 - 半岛拖鞋

Linux下手动安装部署MySQL8.4 Flask JWT简单但完整的项目部署 定位informix oninit进程CPU占用过高的一般步骤 使用Eclipse Memory Analyzer分析java程序占用内存的情况 解决C#连接informix数据库中文乱码 Python手动新建环境 @ApiImplicitParam DataType参数的数据类型 C# Odbc Informix读取中文方法 eclise国内镜像下载地址 Spring Initializr - LSP - Failed to fetch Generation from Spring IO: port out of range: -1 oracle express 18安装后初次登录 linux 查找并批量kill进程 从WebService的SOAP返回数据中获取子级的XML内容 Alpine Linux添加中文支持显示 VBS字符串在不同编码之间的转换 C#根据wsdl文件生成客户端调用代码 PHP 7.4 checking for libzip 和 failed to open error_log 问题 PHP连接Informix异常 CentOS安装扩展软件支持库
C# 进行用(反)序列化方法实现xml与对象进行互相转换
半岛拖鞋 · 2022-05-19 · via 博客园 - 半岛拖鞋

在开发过程中我们可能会进行xml字符传与指定对象之间进行互相转换。用XmlSerializer对象可以把C#对象转换成xml字符串,当然也可以把xml字符串反序为指定的对象。我们用到以下的类方法进行操作

public class XmlHelper
    {
        /// <summary>
        /// 把对象转换成xml
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static string serialize(object o)
        {
            var xml = "";
            if (o == null)
            {
                return xml;
            }

            return serialize(o, o.GetType());
        }

        /// <summary>
        /// 把对象转换成xml
        /// </summary>
        /// <param name="o"></param>
        /// <param name="type">指定对象类型</param>
        /// <returns></returns>
        public static string serialize(object o, Type type)
        {
            var xml = "";
            if (o == null)
            {
                return xml;
            }

            //序列化对象
            XmlSerializer serializer = new XmlSerializer(type);
            // 输出
            Stream stream = new MemoryStream();
            serializer.Serialize(stream, o);
            stream.Position = 0;
            StreamReader sr = new StreamReader(stream);
            xml = sr.ReadToEnd();
            sr.Dispose();
            sr.Close();

            stream.Dispose();
            stream.Close();

            return xml;
        }

        /// <summary>
        /// 反序化xml为对象
        /// </summary>
        /// <param name="xml"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public static object deserialize(string xml, Type type)
        {
            try
            {
                using (StringReader sr = new StringReader(xml))
                {
                    XmlSerializer serializer = new XmlSerializer(type);
                    return serializer.Deserialize(sr);
                }
            }
            catch (Exception e)
            {
                return null;
            }
        }
    }

,在使用时可如下操作:

//对象定义
[XmlRoot("DocumentElement")]
    public class DocumentElement
    {
        //[XmlArray("DataTables"), XmlArrayItem("DataTable")] //DataTables内包含DataTable
        [XmlElement("DataTable")] //DataTable平行出现,不出现data
        public List<MyDataTable> data { get; set; }
    }

    [XmlRoot("DataTable")]//在xml文本需要DataTable为节点名,但DataTable又是C#关键字的时候
    public class MyDataTable
    {
        [XmlElement(IsNullable = true)]
        public string oper { get; set; }
        [XmlElement(IsNullable = true)]
        public string gcode { get; set; }
        [XmlElement(IsNullable = true)]
        public string charge_code { get; set; }
        [XmlElement(IsNullable = true)]
        public string gname { get; set; }
        [XmlElement(IsNullable = true)]
        public string gname1 { get; set; }
        [XmlElement(IsNullable = true)]
        public string spn { get; set; }
        [XmlElement(IsNullable = true)]
        public string produrceid { get; set; }
        [XmlElement(IsNullable = true)]
        public string produrce { get; set; }
        [XmlElement(IsNullable = true)]
        public string unit { get; set; }
        [XmlElement(IsNullable = true)]
        public string caseunit { get; set; }
        [XmlElement(IsNullable = true)]
        public string pack { get; set; }
        [XmlElement(IsNullable = true)]
        public string zjm { get; set; }
        [XmlElement(IsNullable = true)]
        public string status { get; set; }
        public decimal price { get; set; }
        public decimal price1 { get; set; }
        [XmlElement(IsNullable=true)]
        public string zbh { get; set; }

    }
//测试序列化
            var xml = "";
            DocumentElement de = new DocumentElement();


            var mdt = new MyDataTable();
            mdt.caseunit = "";
            mdt.charge_code = "X24538";

            var mdt2 = new MyDataTable();
            mdt2.caseunit = "";
            mdt2.charge_code = "X24538";

            de.data = new List<MyDataTable>();
            de.data.Add(mdt);
            de.data.Add(mdt2);

            xml = XmlHelper.serialize(de);
            Console.WriteLine(xml);    

,接下来可以测试xml字符串转换成类对象

先输入xml文件,XMLFile1.xml的内容:

<?xml version="1.0" encoding="utf-8" ?>
<DocumentElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <DataTable>
    <oper xsi:nil="true" />
    <gcode xsi:nil="true" />
    <charge_code>X24538</charge_code>
    <gname xsi:nil="true" />
    <gname1 xsi:nil="true" />
    <spn xsi:nil="true" />
    <produrceid xsi:nil="true" />
    <produrce xsi:nil="true" />
    <unit xsi:nil="true" />
    <caseunit></caseunit>
    <pack xsi:nil="true" />
    <zjm xsi:nil="true" />
    <status xsi:nil="true" />
    <price>0</price>
    <price1>0</price1>
    <zbh xsi:nil="true" />
  </DataTable>
  <DataTable>
    <oper xsi:nil="true" />
    <gcode xsi:nil="true" />
    <charge_code>X24538</charge_code>
    <gname xsi:nil="true" />
    <gname1 xsi:nil="true" />
    <spn xsi:nil="true" />
    <produrceid xsi:nil="true" />
    <produrce xsi:nil="true" />
    <unit xsi:nil="true" />
    <caseunit></caseunit>
    <pack xsi:nil="true" />
    <zjm xsi:nil="true" />
    <status xsi:nil="true" />
    <price>0</price>
    <price1>0</price1>
    <zbh xsi:nil="true" />
  </DataTable>
</DocumentElement>

测试反序化:

var content = File.ReadAllText(Environment.CurrentDirectory + @"\XMLFile1.xml");
            DocumentElement de = XmlHelper.deserialize(content, typeof(DocumentElement)) as DocumentElement;
            if (de != null)
            {
                var length = de.data.Count;
                //Console.WriteLine(de.data[length-1].charge_code);
                foreach (var item in de.data)
                {
                    Console.WriteLine(item.charge_code);
                }
            }

关于参数的说明:

1. [XmlArray("DataTables"), XmlArrayItem("DataTable")] //DataTables内包含DataTable
默认情况下,集合数据在转换为xml字符串时,是父级DataTables包含子集DataTable的形式,如:<DataTables><DataTable>?</DataTable><DataTable>?</DataTable>...</DataTables>
1. [XmlElement("DataTable")] //DataTable平行出现,
当不需要显示父级DataTables这个字段时,用这种方式注释,DataTable平行出现,如:<DataTable>?</DataTable><DataTable>?</DataTable><DataTable>?</DataTable><DataTable>?</DataTable>...