C#復(fù)雜XML反序列化為實(shí)體對(duì)象兩種方式小結(jié)
前言
今天主要講的是如何把通過(guò)接口獲取到的Xml數(shù)據(jù)轉(zhuǎn)換成(反序列化)我們想要的實(shí)體對(duì)象,當(dāng)然Xml反序列化和Json反序列化的方式基本上都是大同小異。都是我們事先定義好對(duì)應(yīng)的對(duì)應(yīng)的Xml實(shí)體模型,不過(guò)Xml是通過(guò)XmlSerializer類(lèi)的相關(guān)特性來(lái)對(duì)實(shí)體對(duì)象和 XML文檔之間進(jìn)行序列化和反序列化操作的。序列化和反序列化其實(shí)都還好,我們可以調(diào)用封裝好的XmlHelper幫助類(lèi)即可實(shí)現(xiàn),最關(guān)鍵的是我們?cè)撊绾稳ザx這些實(shí)體模型(Model)。當(dāng)你遇到對(duì)方接口一下子返回一大串的Xml數(shù)據(jù)并且里面存在很多不同的Xml節(jié)點(diǎn),你該怎么辦一個(gè)一個(gè)去解析這些節(jié)點(diǎn)到模型上去嗎?本文我主要講兩種方式,第一種方法是通過(guò)手寫(xiě)的方式去定義Xml的實(shí)體對(duì)象模型類(lèi),第二種方法是通過(guò)Visual Studio自帶的生成Xml實(shí)體對(duì)象模型類(lèi)。
需要操作的Xml數(shù)據(jù)
注意:以下是我稍微簡(jiǎn)化的Xml數(shù)據(jù),實(shí)際數(shù)據(jù)可能比這里要復(fù)雜個(gè)大幾倍。
<?xml version="1.0" encoding="utf-8" ?>
<envelope>
<header>
<version port="1111" host="www.baidu.com">successfuly</version>
<timestamp>20211216081218</timestamp>
</header>
<response type="cities" product="hotel">
<cities>
<city>
<code value="zg" />
<city_tax value="true" />
<names>
<name language="fr" value="ABANO TERME - PADOUE" />
<name language="en" value="ABANO TERME - PADUE" />
<name language="nl" value="ABANO TERME - PADUE" />
</names>
</city>
<city>
<code value="hk" />
<city_tax value="false" />
<names>
<name language="fr" value="ABBADIA SAN SALVATORE - SIENNE" />
<name language="en" value="ABBADIA SAN SALVATORE - SIENA" />
<name language="nl" value="ABBADIA SAN SALVATORE - SIENA" />
</names>
</city>
</cities>
</response>
</envelope>一、通過(guò)是手寫(xiě)的方式去定義Xml的實(shí)體對(duì)象模型類(lèi)
當(dāng)然假如你有耐心、時(shí)間充足并且眼睛好的話可以使用這種手寫(xiě)的方式去定義,很多情況寫(xiě)到最好都會(huì)把自己給寫(xiě)糊涂了(可能是我年紀(jì)大了的原因)。
namespace Practices.Models
{
/// <summary>
/// Envelope
/// </summary>
[XmlType(TypeName = "envelope")]
public class CityDataModel
{
/// <summary>
/// header
/// </summary>
[XmlElement("header")]
public Header header { get; set; }
/// <summary>
/// response
/// </summary>
[XmlElement("response")]
public Response response { get; set; }
}
/// <summary>
/// Header
/// </summary>
[XmlType(TypeName = "header")]
public class Header
{
/// <summary>
/// version
/// </summary>
[XmlElement("version")]
public Version version { get; set; }
/// <summary>
/// timestamp
/// </summary>
[XmlElement("timestamp")]
public string timestamp { get; set; }
}
/// <summary>
/// Version
/// </summary>
public class Version
{
/// <summary>
/// port
/// </summary>
[XmlAttribute("port")]
public string port { get; set; }
/// <summary>
/// host
/// </summary>
[XmlAttribute("host")]
public string host { get; set; }
/// <summary>
/// value:XmlTextAttribute指示該屬性作為XML文本處理
/// </summary>
[XmlTextAttribute()]
public string value { get; set; }
}
/// <summary>
/// Response
/// </summary>
[XmlType(TypeName = "response")]
public class Response
{
/// <summary>
/// type
/// </summary>
[XmlAttribute]
public string type { get; set; }
/// <summary>
/// product
/// </summary>
[XmlAttribute]
public string product { get; set; }
/// <summary>
/// cities
/// </summary>
[XmlArray("cities")]
public List<City> cities { get; set; }
}
/// <summary>
/// class: City
/// </summary>
[XmlType(TypeName = "city")]
public class City
{
/// <summary>
/// code
/// </summary>
[XmlElement("code")]
public Code code { get; set; }
/// <summary>
/// city_tax
/// </summary>
[XmlElement("city_tax")]
public City_tax city_tax { get; set; }
/// <summary>
/// names
/// </summary>
[XmlArray("names")]
public List<Name> names { get; set; }
}
/// <summary>
/// class: Code
/// </summary>
[XmlType(TypeName = "code")]
public class Code
{
/// <summary>
///
/// </summary>
[XmlAttribute("value")]
public string value { get; set; }
}
/// <summary>
/// class: City_tax
/// </summary>
[XmlType(TypeName = "city_tax")]
public class City_tax
{
/// <summary>
///
/// </summary>
[XmlAttribute("value")]
public string value { get; set; }
}
/// <summary>
/// class: Name
/// </summary>
[XmlType(TypeName = "name")]
public class Name
{
/// <summary>
///
/// </summary>
[XmlAttribute("language")]
public string language { get; set; }
/// <summary>
///
/// </summary>
[XmlAttribute("value")]
public string value { get; set; }
}
}二、通過(guò)Visual Studio自帶的生成Xml實(shí)體對(duì)象模型類(lèi)
Vs被稱(chēng)為宇宙最強(qiáng)IDE也不是沒(méi)有理由的,它集成了很多自動(dòng)創(chuàng)建功能,如自動(dòng)生成Json類(lèi)、Xml類(lèi)等,雖然說(shuō)使用Vs自動(dòng)生成的Xml模型可讀性有點(diǎn)差并且有些冗余,但是快捷省事,只需要略微改動(dòng)一下即可使用。
1、首先Ctrl+C復(fù)制你需要生成的Xml文檔內(nèi)容
2、找到編輯=》選擇性粘貼=》將Xml粘貼為類(lèi)

3、以下是使用VS自動(dòng)生成的Xml類(lèi)
namespace Practices.Models
{
// 注意: 生成的代碼可能至少需要 .NET Framework 4.5 或 .NET Core/Standard 2.0。
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
//TODO:注意這里因?yàn)槲野杨?lèi)名改成了我自定義的,所以在TypeName這里需要聲明Xml文檔的節(jié)點(diǎn)名
[System.Xml.Serialization.XmlTypeAttribute(typeName: "envelope")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class NewCityDataModel
{
private envelopeHeader headerField;
private envelopeResponse responseField;
/// <remarks/>
public envelopeHeader header
{
get
{
return this.headerField;
}
set
{
this.headerField = value;
}
}
/// <remarks/>
public envelopeResponse response
{
get
{
return this.responseField;
}
set
{
this.responseField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class envelopeHeader
{
private envelopeHeaderVersion versionField;
private ulong timestampField;
/// <remarks/>
public envelopeHeaderVersion version
{
get
{
return this.versionField;
}
set
{
this.versionField = value;
}
}
/// <remarks/>
public ulong timestamp
{
get
{
return this.timestampField;
}
set
{
this.timestampField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class envelopeHeaderVersion
{
private ushort portField;
private string hostField;
private string valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public ushort port
{
get
{
return this.portField;
}
set
{
this.portField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string host
{
get
{
return this.hostField;
}
set
{
this.hostField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public string Value
{
get
{
return this.valueField;
}
set
{
this.valueField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class envelopeResponse
{
private envelopeResponseCity[] citiesField;
private string typeField;
private string productField;
/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("city", IsNullable = false)]
public envelopeResponseCity[] cities
{
get
{
return this.citiesField;
}
set
{
this.citiesField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string type
{
get
{
return this.typeField;
}
set
{
this.typeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string product
{
get
{
return this.productField;
}
set
{
this.productField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class envelopeResponseCity
{
private envelopeResponseCityCode codeField;
private envelopeResponseCityCity_tax city_taxField;
private envelopeResponseCityName[] namesField;
/// <remarks/>
public envelopeResponseCityCode code
{
get
{
return this.codeField;
}
set
{
this.codeField = value;
}
}
/// <remarks/>
public envelopeResponseCityCity_tax city_tax
{
get
{
return this.city_taxField;
}
set
{
this.city_taxField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("name", IsNullable = false)]
public envelopeResponseCityName[] names
{
get
{
return this.namesField;
}
set
{
this.namesField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class envelopeResponseCityCode
{
private string valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string value
{
get
{
return this.valueField;
}
set
{
this.valueField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class envelopeResponseCityCity_tax
{
private bool valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public bool value
{
get
{
return this.valueField;
}
set
{
this.valueField = value;
}
}
}
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class envelopeResponseCityName
{
private string languageField;
private string valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string language
{
get
{
return this.languageField;
}
set
{
this.languageField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string value
{
get
{
return this.valueField;
}
set
{
this.valueField = value;
}
}
}
}驗(yàn)證兩個(gè)Xml類(lèi)是否能夠反序列化成功
/// <summary>
/// 讀取Xml文件內(nèi)容反序列化為指定的對(duì)象
/// </summary>
/// <param name="filePath">Xml文件的位置(絕對(duì)路徑)</param>
/// <returns></returns>
public static T DeserializeFromXml<T>(string filePath)
{
try
{
if (!File.Exists(filePath))
throw new ArgumentNullException(filePath + " not Exists");
using (StreamReader reader = new StreamReader(filePath))
{
XmlSerializer xs = new XmlSerializer(typeof(T));
T ret = (T)xs.Deserialize(reader);
return ret;
}
}
catch (Exception ex)
{
return default(T);
}
}C# XML基礎(chǔ)入門(mén)(XML文件內(nèi)容增刪改查清)
http://www.dhdzp.com/article/243168.htm
C#XmlHelper幫助類(lèi)操作Xml文檔的通用方法匯總
http://www.dhdzp.com/article/242389.htm
.NET中XML序列化和反序列化常用類(lèi)和用來(lái)控制XML序列化的屬性總結(jié)
http://www.dhdzp.com/article/243165.htm
到此這篇關(guān)于C#復(fù)雜XML反序列化為實(shí)體對(duì)象兩種方式小結(jié)的文章就介紹到這了,更多相關(guān)C#復(fù)雜XML反序列化為實(shí)體對(duì)象 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Unity中的RegisterPlugins實(shí)用案例深入解析
這篇文章主要為大家介紹了Unity中的RegisterPlugins實(shí)用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
C#實(shí)現(xiàn)餐飲管理系統(tǒng)完整版
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)餐飲管理系統(tǒng)的完整版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
C#發(fā)送和接收HTTP請(qǐng)求類(lèi)HttpWebRequest的用法
這篇文章主要給大家介紹了關(guān)于C#發(fā)送和接收HTTP請(qǐng)求類(lèi)HttpWebRequest用法的相關(guān)資料,C#中的HttpWebRequest是一個(gè)用于發(fā)送HTTP請(qǐng)求的類(lèi),它可以用于向Web服務(wù)器發(fā)送GET、POST、PUT、DELETE等請(qǐng)求,需要的朋友可以參考下2024-06-06

