C#实体类(复杂类)与XML互相转换

实体类转换成XML方法:

将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化

  1. public static string XmlSerialize<T>(T obj)

  2.  

    {

  3.  

    using (System.IO.StringWriter sw = new StringWriter())

  4.  

    {

  5.  

    Type t = obj.GetType();

  6.  

    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());

  7.  

    serializer.Serialize(sw, obj);

  8.  

    sw.Close();

  9.  

    return sw.ToString();

  10.  

    }

  11.  

    }

例子:

定义实体类

  1. public class root

  2.  

    {

  3.  

    public head head { get; set; }

  4.  

    public body body { get; set; }

  5.  

    }

  6.  

  7.  

    public class head

  8.  

    {

  9.  

    public string organ { get; set; }

  10.  

    public string jkxlh { get; set; }

  11.  

    public string jkid { get; set; }

  12.  

    }

  13.  

  14.  

    //注意!body类的vehispara的类型是dynamic 所以需要使用XmlInclude表示body可以解析的类型

  15.  

    [System.Xml.Serialization.XmlInclude(typeof(JCZ01))]

  16.  

    [System.Xml.Serialization.XmlInclude(typeof(JCZ02))]

  17.  

    public partial class body

  18.  

    {

  19.  

    public dynamic vehispara { get; set; }//接受动态业务类型 即JCZ01、JCZ02等等

  20.  

    }

  21.  

  22.  

    public class JCZ01

  23.  

    {

  24.  

    public string tsno { get; set; }

  25.  

    public string orgcode { get; set; }

  26.  

    public string teststation { get; set; }

  27.  

    public string testaddress { get; set; }

  28.  

    public DateTime? firstauthdate { get; set; }

  29.  

    public DateTime? jlrzyxrq { get; set; }

  30.  

    public DateTime? linkdate { get; set; }

  31.  

    public string legalperson { get; set; }

  32.  

    public string test { get; set; }

  33.  

    public string testtel { get; set; }

  34.  

    public int testlines { get; set; }

  35.  

    public string status { get; set; }

  36.  

    public decimal? lng { get; set; }

  37.  

    public decimal? lat { get; set; }

  38.  

    }

  39.  

  40.  

    public class JCZ02

  41.  

    {

  42.  

    public string tsno { get; set; }

  43.  

    public string testlineno { get; set; }

  44.  

    public string firstauthdate { get; set; }

  45.  

    public string testtype { get; set; }

  46.  

    public string status { get; set; }

  47.  

    public string gwip { get; set; }

  48.  

    public string lxpzq { get; set; }

  49.  

    public string lxpzh { get; set; }

  50.  

    public string lxpzczj { get; set; }

  51.  

    public string lxpzdt { get; set; }

  52.  

    public string jclc { get; set; }

  53.  

    public string jcbbh { get; set; }

  54.  

    public string provider { get; set; }

  55.  

    public string testexpiredade { get; set; }

  56.  

    public string dynamometer { get; set; }

  57.  

    public string dprovider { get; set; }

  58.  

    public string dadate { get; set; }

  59.  

    public string analyser { get; set; }

  60.  

    public string aprovider { get; set; }

  61.  

    public string aadate { get; set; }

  62.  

    public string flowmeter { get; set; }

  63.  

    public string fprovider { get; set; }

  64.  

    public string fadate { get; set; }

  65.  

    public string smokemeter { get; set; }

  66.  

    public string sprovider { get; set; }

  67.  

    public string sadate { get; set; }

  68.  

    public string tachometer { get; set; }

  69.  

    public string tprovider { get; set; }

  70.  

    public string tadate { get; set; }

  71.  

    public string otsensor { get; set; }

  72.  

    public string oprovider { get; set; }

  73.  

    public string oadate { get; set; }

  74.  

    public string wstype { get; set; }

  75.  

    public string wsrovider { get; set; }

  76.  

    }

实体类转XML代码

  1. //Linq to sql 获取数据

  2.  

    var query = from sta in det.Org_DetectStation join line in lineCount on sta.StaID equals line.StaID

  3.  

    where sta.StaID == staid

  4.  

    select new JCZ01

  5.  

    {

  6.  

    tsno = cityid + sta.StaID.Substring(4,2),

  7.  

    orgcode = cityid + sta.StaID.Substring(4, 2),

  8.  

    teststation = sta.StaName,

  9.  

    testaddress = sta.Address,

  10.  

    firstauthdate = sta.CMADate,

  11.  

    jlrzyxrq = sta.CMADate,

  12.  

    linkdate = sta.CMADate,

  13.  

    legalperson = sta.CEOName,

  14.  

    test = sta.CEOName,

  15.  

    testtel = sta.CEOOfficePhone,

  16.  

    testlines = line.LineCount,

  17.  

    status = sta.StaState==0?"1":"2",

  18.  

    lng = sta.Longitude,

  19.  

    lat = sta.Latitude

  20.  

    };

  21.  

    List<JCZ01> jcz011 = query.ToList<JCZ01>();

  22.  

    root r = new root();

  23.  

    head h = new head();

  24.  

    h.jkid = Properties.Settings.Default.JKBH;

  25.  

    h.jkxlh = Properties.Settings.Default.JKXLH;

  26.  

    body b = new body();

  27.  

    b.vehispara = jcz011[0];

  28.  

    r.head = h;

  29.  

    r.body = b;

  30.  

  31.  

    string strhxml = XmlSerialize<head>(h);

  32.  

    string strbxml = XmlSerialize<body>(b);

  33.  

    string strrxml = XmlSerialize<root>(r);

生成的XML实例

  1. <?xml version="1.0" encoding="utf-16"?>

  2.  

    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  3.  

    <head>

  4.  

    <jkxlh>BD11F82096F0290DB2866BD266A0CEDF</jkxlh>

  5.  

    <jkid>23270000</jkid>

  6.  

    </head>

  7.  

    <body>

  8.  

    <vehispara xsi:type="JCZ01">

  9.  

    <tsno>23270002</tsno>

  10.  

    <orgcode>23270002</orgcode>

  11.  

    <teststation>XXXX有限公司</teststation>

  12.  

    <testaddress>测试</testaddress>

  13.  

    <firstauthdate>2038-08-11T00:00:00</firstauthdate>

  14.  

    <jlrzyxrq>2038-08-11T00:00:00</jlrzyxrq>

  15.  

    <linkdate>2038-08-11T00:00:00</linkdate>

  16.  

    <legalperson>测试</legalperson>

  17.  

    <test>测试</test>

  18.  

    <testtel />

  19.  

    <testlines>1</testlines>

  20.  

    <status>1</status>

  21.  

    <lng xsi:nil="true" />

  22.  

    <lat xsi:nil="true" />

  23.  

    </vehispara>

  24.  

    </body>

  25.  

    </root>

XML转实体类:

把XML转换成相应的实体类,需要使用到XmlSerializer类的Deserialize方法,将XML进行反序列化

  1. public static T DESerializer<T>(string strXML) where T:class

  2.  

    {

  3.  

    try

  4.  

    {

  5.  

    using (StringReader sr = new StringReader(strXML))

  6.  

    {

  7.  

    XmlSerializer serializer = new XmlSerializer(typeof(T));

  8.  

    return serializer.Deserialize(sr) as T;

  9.  

    }

  10.  

    }

  11.  

    catch (Exception ex)

  12.  

    {

  13.  

    return null;

  14.  

    }

  15.  

    }

实体类转XML需注意的问题:

当实体类的string类型字段为null时,序列化成XML时会忽略掉这个字段(即序列化后的XML中没有该节点)

解决的办法我知道的有两个,第一个把该字段赋值为空字符串,另一个就是给类的属性加上XmlElement(IsNullable=true)特性,如:

  1. public class JCZ01

  2.  

    {

  3.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  4.  

    public string tsno { get; set; }

  5.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  6.  

    public string orgcode { get; set; }

  7.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  8.  

    public string teststation { get; set; }

  9.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  10.  

    public string testaddress { get; set; }

  11.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  12.  

    public DateTime? firstauthdate { get; set; }

  13.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  14.  

    public DateTime? jlrzyxrq { get; set; }

  15.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  16.  

    public DateTime? linkdate { get; set; }

  17.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  18.  

    public string legalperson { get; set; }

  19.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  20.  

    public string test { get; set; }

  21.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  22.  

    public string testtel { get; set; }

  23.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  24.  

    public int? testlines { get; set; }

  25.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  26.  

    public string status { get; set; }

  27.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  28.  

    public decimal? lng { get; set; }

  29.  

    [System.Xml.Serialization.XmlElement(IsNullable = true)]

  30.  

    public decimal? lat { get; set; }

  31.  

    }

参考:https://www.cnblogs.com/dotnet261010/p/6513618.html

出处:https://blog.csdn.net/CGS_______/article/details/84559590

原文地址:https://www.cnblogs.com/mq0036/p/12033131.html

时间: 2024-10-10 02:13:01

C#实体类(复杂类)与XML互相转换的相关文章

利用JAXB实现java实体类和xml互相转换

1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同理).map.Teacher.Date 类型的属性 package jaxb; import java.util.Date; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.XmlAccess

利用XStream实现实体类与xml的转换

package com.wanhua.util; import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.io.xml.DomDriver; /** * 利用XStream实现实体类与xml的转换 *  * @author w_xfpenga *  *         2014-11-27 */public class XStream2Text { static XStream xStream = new X

实体类与CDATA类型的xml的转换的工具类

package com.wanhua.util; import java.io.StringReader;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; import org.jdom.Document;import org.jdom.Element;import org.jdom.input.SAXBuilder;import org.xml.sax.

C# 调用API接口处理公共类 自带JSON实体互转类

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; using System.Web; n

python_way.day7 模块(configparser,xml,shutil,subprocess)、面向对象(上)(创建类,类的构成,函数式编程与面向对象编程的选择,类的继承)

python_way.day7 1.模块 configparser,xml,shutil,subprocess 2.面向对象(上) 创建类,类的构成,函数式编程与面向对象编程的选择,类的继承 1.模块 configparser 用于处理特定格式的文件,其本职上使用open来操作,只能是  [test1] 特定的格式 [test1] k1 = 123 k2 = True [test2] k1 = 123 k2 = v1 文件内容 1.获取 import configparser #打开文件找到文件

一个实体类基类实现

为了观察变量方便,我们通常会重写实体类模型的toString方法,可是每一个类都写.有些冗余. 事实上,能够这样子: package others; import java.io.Serializable; import java.lang.reflect.Field; import org.apache.commons.lang3.builder.ToStringBuilder; /** * 重写toString()的实体类基类 * @author limenghua * */ public

Java常用实体类--System类

字符串.日期.数字是Java程序中最常使用的数据对象,对这些数据的创建.修改.格式化和转换等操作融入在Java程序的每个角落,必须熟练掌握.本节将通过实例演示以下常用实体类 Java系统级类:系统类System.运行时类Runtime Java字符串处理类:字符串类String.字符串分隔符类StringTokenizer.线程安全的可变字符串类StringBuffer.可变字符串类StringBuilder Java日期处理类:日期类Date.日期格式化类DateFormate.日历类Cale

类与类的初始化

面向对象(Object-Oriented):是一种按照人们认识客观世界的思维方式,采用基于对象(实体)的概念建立抽象的模型,模拟客观世界分析.设计.实现软件的方法. 类(Class):具有相同属性.操作的抽象的集合. 类的成员: 类包括成员变量和成员函数,其具有3种属性私有(private).公有(public)和保护(protected). private:只能被该类中的函数访问,被友元函数访问: 不能被任何其他访问,该类的对象也不能访问. public:可以被该类的函数.子类的函数.友元函数

java类Date类概述及其方法

1.Date类概述 类Date表示特定的瞬间,精确到毫秒 2.构造方法 public Date() public Date(long date) 3.成员方法 public long getTime() public void setTime(long time) package com; import java.util.Date; /**  * Date类概述  *  Date类表示特定的瞬间,精确到毫秒  *   * 构造方法  *  public Date()  *  public Da

C++ 常用类 string类

===6.3.2使用string对象=== string word="I love China" *链接字符串* string description=adjective  + " " + word; _Note_: 不能连接两个字符串字面量,下面的语句是错误的 string test= "I have" + "a dream"; ===6.3.3访问字符串中的字符=== *读取字符串* getline(cin, text);