[英]Deserializing XML to Objects in C#
所以我有一個看起來像這樣的 xml:
<todo-list>
<id type="integer">#{id}</id>
<name>#{name}</name>
<description>#{description}</description>
<project-id type="integer">#{project_id}</project-id>
<milestone-id type="integer">#{milestone_id}</milestone-id>
<position type="integer">#{position}</position>
<!-- if user can see private lists -->
<private type="boolean">#{private}</private>
<!-- if the account supports time tracking -->
<tracked type="boolean">#{tracked}</tracked>
<!-- if todo-items are included in the response -->
<todo-items type="array">
<todo-item>
...
</todo-item>
<todo-item>
...
</todo-item>
...
</todo-items>
</todo-list>
我將如何使用 .NET 的序列化庫將其反序列化為 C# 對象?
目前我正在使用反射,並使用命名約定在 xml 和我的對象之間進行映射。
為每個元素創建一個類,每個元素具有每個元素的屬性,並為每個子元素創建一個List或Array對象(使用創建的對象)。 然后對字符串調用System.Xml.Serialization.XmlSerializer.Deserialize並將結果轉換為對象。 使用System.Xml.Serialization屬性進行調整,例如將元素映射到ToDoList類,使用XmlElement(“todo-list”)屬性。
shourtcut是將XML加載到Visual Studio中,單擊“推斷模式”按鈕並運行“xsd.exe / c schema.xsd”以生成類。 xsd.exe位於tools文件夾中。 然后瀏覽生成的代碼並進行調整,例如在適當的地方將短路更改為整數。
歸結為使用VS中的工具中的xsd.exe:
xsd.exe "%xsdFile%" /c /out:"%outDirectory%" /l:"%language%"
然后用讀取器和反序列化器加載它:
public GeneratedClassFromXSD GetObjectFromXML()
{
var settings = new XmlReaderSettings();
var obj = new GeneratedClassFromXSD();
var reader = XmlReader.Create(urlToService, settings);
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(GeneratedClassFromXSD));
obj = (GeneratedClassFromXSD)serializer.Deserialize(reader);
reader.Close();
return obj;
}
反序列化任何對象,只要類型T
標記為Serializable:
function T Deserialize<T>(string serializedResults)
{
var serializer = new XmlSerializer(typeof(T));
using (var stringReader = new StringReader(serializedResults))
return (T)serializer.Deserialize(stringReader);
}
好吧,你必須在程序集中擁有大致匹配XML的類(稱為Private的屬性,稱為ToDo的集合屬性等)。
問題是XML具有對類名無效的元素 。 因此,您必須在這些類中實現IXmlSerializable,以控制它們與XML的序列化方式。 您也可以使用某些xml序列化特定屬性,但這取決於您的xml架構。
這是使用反射的一步,但它可能不是你所希望的。
結帳http://xsd2code.codeplex.com/
Xsd2Code是來自XSD架構的CSharp或Visual Basic業務實體類生成器。
有幾種不同的選擇。
system.xml.serialization.xmlserializer
使用的類 你應該看看http://www.canerten.com/xml-c-class-generator-for-c-using-xsd-for-deserialization/
有一個(Microsoft)工具可以幫助創建所需的XSD,以便將XML正確地反序列化為對象
幾年前我有同樣的問題,如何將xml映射到C#類或創建映射到我們的XML的C#類,就像我們在實體框架中那樣(我們將表映射到C#類)。 我最終創建了一個框架,它可以用你的XML創建C#類,這些類可以用來讀/寫你的xml。 看看
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.