簡體   English   中英

在 C# 中將 XML 反序列化為對象

[英]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業務實體類生成器。

有幾種不同的選擇。

  • Visual Studio包含一個名為xsd.exe的命令行程序。 您使用該程序創建模式文檔,並在模式文檔上再次使用該程序來創建可與system.xml.serialization.xmlserializer使用的類
  • 您可能只能在其上調用Dataset.ReadXml()。

你應該看看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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM