[Visual Studio 2012][Visual Studio 2013] Paste Special - 貼上 JSON 或 XML 文字 轉換類別
我很習慣透過序列化來處理 JSON/XML,地表上最強的IDE很貼心的提供了 Paste Special 功能,它能夠把 XML/JSON 文字,轉換成類別
如上篇,http://www.dotblogs.com.tw/yc421206/archive/2011/12/26/63366.aspx 寫對應類別真的很煩人,所以說現在還在手動寫類別的話就落伍了
<epcis:EPCISDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sensor="http://epcis.gs1hk.org/ns/sensor" xmlns:gs1hk="urn:epcglobal:gs1hk:xsd:ext" schemaVersion="1" creationDate="2010-09-15T04:07:52" xmlns:epcis="urn:epcglobal:epcis:xsd:1">
<EPCISBody>
<EventList>
<ObjectEvent>
<eventTime>2011-12-25T17:04:52</eventTime>
<eventTimeZoneOffset>+08:00</eventTimeZoneOffset>
<epcList>
<epc>BBAA99887766554400085172</epc>
<epc>BBAA99887766554400085173</epc>
</epcList>
<action>OBSERVE</action>
<bizStep>urn:epcglobal:fmcg:bizstep:Gate_In</bizStep>
<bizLocation>
<id>urn:epcglobal:fmcg:loc.MMMMM.202.MZMFG_Warehouse_Gate_Door,414.Gate_Door2</id>
</bizLocation>
<bizTransactionList>
<bizTransaction type="urn:gs1hk:ext:order">China</bizTransaction>
</bizTransactionList>
<sensor:temperature>20.5</sensor:temperature>
<sensor:state>Alram</sensor:state>
<sensor:temperaturereporturl>http://www.gts-portal.co/Z/Page/TempChart.aspx?EPC=BBAA99887766554400085172&Date=2011-12-25T17:04:52</sensor:temperaturereporturl>
</ObjectEvent>
</EventList>
</EPCISBody>
</epcis:EPCISDocument>
有了Paste Special 彈指間資料格式瞬間變成我要的類別,有夠驚人的
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "urn:epcglobal:epcis:xsd:1")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "urn:epcglobal:epcis:xsd:1", IsNullable = false)]
public partial class EPCISDocument
{
private EPCISBody ePCISBodyField;
private byte schemaVersionField;
private System.DateTime creationDateField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Namespace = "")]
public EPCISBody EPCISBody
{
get
{
return this.ePCISBodyField;
}
set
{
this.ePCISBodyField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public byte schemaVersion
{
get
{
return this.schemaVersionField;
}
set
{
this.schemaVersionField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public System.DateTime creationDate
{
get
{
return this.creationDateField;
}
set
{
this.creationDateField = value;
}
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class EPCISBody
{
private EPCISBodyEventList eventListField;
/// <remarks/>
public EPCISBodyEventList EventList
{
get
{
return this.eventListField;
}
set
{
this.eventListField = value;
}
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class EPCISBodyEventList
{
private EPCISBodyEventListObjectEvent objectEventField;
/// <remarks/>
public EPCISBodyEventListObjectEvent ObjectEvent
{
get
{
return this.objectEventField;
}
set
{
this.objectEventField = value;
}
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class EPCISBodyEventListObjectEvent
{
private System.DateTime eventTimeField;
private string eventTimeZoneOffsetField;
private string[] epcListField;
private string actionField;
private string bizStepField;
private EPCISBodyEventListObjectEventBizLocation bizLocationField;
private EPCISBodyEventListObjectEventBizTransactionList bizTransactionListField;
private decimal temperatureField;
private string stateField;
private string temperaturereporturlField;
/// <remarks/>
public System.DateTime eventTime
{
get
{
return this.eventTimeField;
}
set
{
this.eventTimeField = value;
}
}
/// <remarks/>
public string eventTimeZoneOffset
{
get
{
return this.eventTimeZoneOffsetField;
}
set
{
this.eventTimeZoneOffsetField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlArrayItemAttribute("epc", IsNullable = false)]
public string[] epcList
{
get
{
return this.epcListField;
}
set
{
this.epcListField = value;
}
}
/// <remarks/>
public string action
{
get
{
return this.actionField;
}
set
{
this.actionField = value;
}
}
/// <remarks/>
public string bizStep
{
get
{
return this.bizStepField;
}
set
{
this.bizStepField = value;
}
}
/// <remarks/>
public EPCISBodyEventListObjectEventBizLocation bizLocation
{
get
{
return this.bizLocationField;
}
set
{
this.bizLocationField = value;
}
}
/// <remarks/>
public EPCISBodyEventListObjectEventBizTransactionList bizTransactionList
{
get
{
return this.bizTransactionListField;
}
set
{
this.bizTransactionListField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Namespace = "http://epcis.gs1hk.org/ns/sensor")]
public decimal temperature
{
get
{
return this.temperatureField;
}
set
{
this.temperatureField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Namespace = "http://epcis.gs1hk.org/ns/sensor")]
public string state
{
get
{
return this.stateField;
}
set
{
this.stateField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Namespace = "http://epcis.gs1hk.org/ns/sensor")]
public string temperaturereporturl
{
get
{
return this.temperaturereporturlField;
}
set
{
this.temperaturereporturlField = value;
}
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class EPCISBodyEventListObjectEventBizLocation
{
private string idField;
/// <remarks/>
public string id
{
get
{
return this.idField;
}
set
{
this.idField = value;
}
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class EPCISBodyEventListObjectEventBizTransactionList
{
private EPCISBodyEventListObjectEventBizTransactionListBizTransaction bizTransactionField;
/// <remarks/>
public EPCISBodyEventListObjectEventBizTransactionListBizTransaction bizTransaction
{
get
{
return this.bizTransactionField;
}
set
{
this.bizTransactionField = value;
}
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class EPCISBodyEventListObjectEventBizTransactionListBizTransaction
{
private string typeField;
private string valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public string type
{
get
{
return this.typeField;
}
set
{
this.typeField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public string Value
{
get
{
return this.valueField;
}
set
{
this.valueField = value;
}
}
}
一切都準備就緒後,就可以真的來寫程式碼
建立資料,資料來源就抄原始檔案
{
EPCISBody = new EPCISBody()
{
EventList = new EPCISBodyEventList()
{
ObjectEvent = new EPCISBodyEventListObjectEvent()
{
eventTime = Convert.ToDateTime("2011-12-25T17:04:52"),
eventTimeZoneOffset = "+08:00",
epcList = new string[] { "BBAA99887766554400085172", "BBAA99887766554400085173" },
action = "OBSERVE",
bizStep = "urn:epcglobal:fmcg:bizstep:Gate_In",
bizLocation = new EPCISBodyEventListObjectEventBizLocation()
{
id = "urn:epcglobal:fmcg:loc.MMMMM.202.MZMFG_Warehouse_Gate_Door,414.Gate_Door2"
},
bizTransactionList = new EPCISBodyEventListObjectEventBizTransactionList()
{
bizTransaction = new EPCISBodyEventListObjectEventBizTransactionListBizTransaction()
{
type = "urn:gs1hk:ext:order",
Value = "China"
}
},
state = "Alram",
temperature = (decimal)20.5d,
temperaturereporturl =
"http://www.gts-portal.co/Z/Page/TempChart.aspx?EPC=BBAA99887766554400085172&Date=2011-12-25T17:04:52"
}
}
}
};
epcisDocument.creationDate = Convert.ToDateTime("2010-09-15T04:07:52");
epcisDocument.schemaVersion = 1;
序列化檔案,XML 的命名空間還是必須要手動自己建立
namespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
namespaces.Add("sensor", "http://epcis.gs1hk.org/ns/sensor");
namespaces.Add("gs1hk", "urn:epcglobal:gs1hk:xsd:ext");
namespaces.Add("epcis", "urn:epcglobal:epcis:xsd:1");
StreamWriter writer = null;
var xml = new XmlSerializer(epcisDocument.GetType());
using (var stream = new FileStream("AA.xml", FileMode.Create, FileAccess.Write, FileShare.Read))
using (writer = new StreamWriter(stream, Encoding.UTF8))
{
xml.Serialize(writer, epcisDocument, namespaces);
}
因為懶得寫單元測試所以就使用 WinMerge 來比對是否產生結果是否正確,下圖沒有任何標記代表原始來源與程式結果一致
文章出自:http://www.dotblogs.com.tw/yc421206/archive/2014/03/05/144250.aspx
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET