web-dev-qa-db-ja.com

C#でXMLをオブジェクトにデシリアライズする

だから私はこのような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とオブジェクトをマッピングしています。

53
Justin Bozonier

各要素のプロパティと各子要素のオブジェクトのリストまたは配列(作成されたものを使用)を持つ各要素のクラスを作成します。次に、文字列に対してSystem.Xml.Serialization.XmlSerializer.Deserializeを呼び出し、結果をオブジェクトとしてキャストします。 System.Xml.Serialization属性を使用して、要素をToDoListクラスにマッピングするなど、XmlElement( "todo-list")属性を使用して調整を行います。

回避策は、XMLをVisual Studioに読み込み、[スキーマの推論]ボタンをクリックして、 "xsd.exe/c schema.xsd"を実行してクラスを生成することです。 xsd.exeはtoolsフォルダーにあります。次に、生成されたコードを調べて、必要に応じてshortをintに変更するなどの調整を行います。

59
Dan Goldstein

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;
}
35
Steve Horn

タイプ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);
}
15
Keith

まあ、おおよそ、XML(Privateと呼ばれるプロパティ、ToDoと呼ばれるコレクションプロパティなど)に一致するクラスをアセンブリに持たなければなりません。

問題は、XMLにはクラス名に無効な要素があるであるということです。したがって、これらのクラスにIXmlSerializableを実装して、XMLとのシリアル化方法を制御する必要があります。一部のxmlシリアル化固有の属性を使用することもできますが、それはxmlのスキーマに依存します。

これはリフレクションを使用した上記の手順ですが、望んでいるものとは異なる場合があります。

4
Will

チェックアウト http://xsd2code.codeplex.com/

Xsd2Codeは、XSDスキーマのCSharpまたはVisual Basicビジネスエンティティクラスジェネレーターです。

4
Deepfreezed

いくつかの異なるオプションがあります。

  • Visual Studioには、xsd.exeというコマンドラインプログラムが含まれています。そのプログラムを使用してスキーマドキュメントを作成し、そのスキーマドキュメントでプログラムを再度使用して、system.xml.serialization.xmlserializerで使用できるクラスを作成します。
  • 単にDataset.ReadXml()を呼び出すことができるかもしれません。
3
Joel Coehoorn

http://www.canerten.com/xml-c-class-generator-for-c-using-xsd-for-deserialization/ をご覧ください

XMLをオブジェクトに適切に逆シリアル化するために必要なXSDの作成を支援する(Microsoft)ツールがあります

3
Luk