2008-09-17 10 views
28

オブジェクトにロードしたいオブジェクトを操作し(値を設定し、値を読み込み)、それらのXMLを元に戻したいXMLを持っています。 私が作成した構造(xsd)にXMLを持たせることが重要です。XMLをC#オブジェクトにマップする方法

これを行うには、自分のシリアライザを書くことですが、そこにはC#でのオープンソースのサポートが組み込まれていますか?

答えて

28

あなたはXsd.exeではを使用してスキーマ(XSD)から、シリアライズC#クラスを生成できます。

xsd.exe dependency1.xsd dependency2.xsd schema.xsd /out:outputDir 

スキーマが依存関係(付属/インポートされたスキーマ)を持っている場合、それらはすべて同じコマンドラインに含まれている必要があります。

+11

[+1]クラスを生成するために/ cを使用するか、XSDを使用するときにDataSet派生クラスを生成するために/ dを使用する必要があります。それ以外の場合、次のエラーメッセージが表示されます。 "エラー:クラスまたはデータセットのうちの1つしか生成できません。" – Marc

0

NetDataContractSerializerは、あなたが望むことができると思います。

7

LINQ to XMLあなたが.net 3.5を使用している場合、非常に強力です。LINQ to XSDもお役に立ちます!

+2

これはXSDへのLINQのために今公式ページです:質問で述べたようhttp://linqtoxsd.codeplex.com/ –

+0

それは実際のC#へのマッピングを行うのですか? – Konstantin

+0

nah、Linq To XMLは永続クラスへのマッピングに使用できません。 –

2

Visual Studioに付属のxsd.exeコマンドラインプログラムを使用して、プロジェクト/ソリューションで使用できるクラスファイルを作成し、System.Xml.Serialization名前空間(具体的にはXmlSerializerクラス)を使用してそれらをシリアル化/逆シリアル化しますディスク間のクラス

2

using System.Xml.Serialization; この名前空間には、xmlを任意のオブジェクトにマップする場合に必要なすべての属性があります。代わりに、xsd.exeツールを使用することもできます。

xsd file.xsd {/ classes | [/ element:element] [/言語:言語] [/ namespace:名前空間] [/ outputdir:directory] ​​[URI:uri] xsdファイルを取得してc#またはvb.netクラスを作成しますそのうちの。

http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx

18

このコードは(以降C#過去ログは1.0)XMLへのほとんどのオブジェクトをシリアル化するために非常によく動作します。 (バック) それはのArrayListを含むオブジェクトに対して機能しない、とだけ配列を使用することができスティック場合は、Microsoftから

using System;  
using System.IO; 
using System.Text; 
using System.Xml.Serialization; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 


public static string Serialize(object objectToSerialize) 
{ 
    MemoryStream mem = new MemoryStream();   
    XmlSerializer ser = new XmlSerializer(objectToSerialize.GetType());   
    ser.Serialize(mem, objectToSerialize);      
    ASCIIEncoding ascii = new ASCIIEncoding(); 
    return ascii.GetString(mem.ToArray()); 
}   

public static object Deserialize(Type typeToDeserialize, string xmlString) 
{ 
    byte[] bytes = Encoding.UTF8.GetBytes(xmlString); 
    MemoryStream mem = new MemoryStream(bytes);   
    XmlSerializer ser = new XmlSerializer(typeToDeserialize); 
    return ser.Deserialize(mem); 
} 
+1

便利なルーチンですが、パラメータのないコンストラクタを持たないオブジェクトでは機能しません。 – ChadD

+0

クラスTypeToDeserializeとそのメンバーに任意の種類のマッピングタグを記述する必要がありますか? –

+0

これは、JSON.NET JSONとデータベースに保存されたXMLの間の変換を支援しました。 JSON.NETは、XML自体を使用してJSONに再マップすることができるXMLを作成しませんでした。つまり、生成されたXMLをASP.NETのXMLメソッドで使用する方法は決して見つけられませんでした。 –

1

Xsd.exeではバグをたくさん持っています:| このオープンソースパールを試すhttp://xsd2code.codeplex.com/

+0

+1これはありがとうございます。実際にはアクティブなプロジェクトであり、いくつかのドキュメントがあります。 – knownasilya

1

XMLからC#クラスを自動生成できるフレームワークを作成しました。 XMLを渡す視覚的なアイテムテンプレートで、クラスはプロジェクトで自動的に生成されます。これらのクラスを使用すると、XMLを作成/読み書きできます。

チェックフレームワークおよびVisual C#の項目テンプレートは、このリンク:click here

1

は、私は、XSDは本当にがらくたであることに同意...しかし、彼らはほとんど誰もが知っている別のバージョンを作りました。その呼び出されるxsdオブジェクトジェネレータ。その次のバージョンと方法がより多くのオプションがあります。それはXSDからファイルを生成し、素晴らしい動作します。 XMLスパイのようなスキーマ・ジェネレータがある場合は、 XMLからxsdを作成し、このツールを使用してください。私はこのツールを使って非常に複雑なクラスを作成しました。 その後、追加のプロパティ\メソッドなどの部分クラスを作成します。その後、スキーマを更新すると、クラスを再生成し、編集は部分クラスに残ります。

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=7075

関連する問題