4

非常に長く、非常に多様な XML ファイルがあり、その一部をデータベースに保存しようとしています。ここで、逆シリアル化されたデータを格納するために 10,000 の異なるオブジェクトを調べて手書きしたくありません。XML ファイルの内容に基づいてオブジェクトを定義する方法はありますか?

たとえば、私が持っていた場合:

<objecttype1>
    <attr1>Some string of text</attr1>
</objecttype1>
<objecttype1>
    <attr2>123456789</attr2>
</objecttype1>

次のようなオブジェクトを定義したいと思います。

public class objecttype1 {
    public string attr1 {get; set;}
    public string attr2 {get; set;}
}

基本的に、xml ドキュメント全体を、元の xml ドキュメントを表すある種の階層構造を持つさまざまなオブジェクトに逆シリアル化し、それらのオブジェクトからデータを抽出して、そのタイプに基づいてデータベースに入れたいと考えています。これを行う方法/より良い方法はありますか?

4

2 に答える 2

8

ExpandoObjectを探しています。
ExpandoObject は、C#4 で導入された動的オブジェクトです。ここにある
サンプル実装:

 public static IEnumerable<dynamic> GetExpandoFromXml(string file, string descendantid)
{
    var expandoFromXml = new List<dynamic>();

    var doc = XDocument.Load(file);
    var nodes = doc.Root.Descendants(descendantid);

    foreach (var element in doc.Root.Descendants(descendantid))
    {
        dynamic expandoObject = new ExpandoObject();
        var dictionary = expandoObject as IDictionary<string, object>;
        foreach (var child in element.Descendants())
        {
            if (child.Name.Namespace == "")
                dictionary[child.Name.ToString()] = child.Value.Trim();
        }
        yield return expandoObject;
    }
}

その他のリンク:
http://www.codeproject.com/Tips/227139/Converting-XML-to-an-dynamic-object-using-ExpandoO
http://www.codeproject.com/Articles/461677/Creating-a- ExpandoOb を使用した XML からの動的オブジェクト

于 2012-11-12T23:46:19.710 に答える
1

つまり、型をXMLからXMLコンテンツで指定された具象型に逆シリアル化する方法はありません。xmlを特定の具象型に逆シリアル化できるようにするには、コードでその型を定義する必要があります。または、タイプの異なる構造を持っている可能性があります。これには、TypeNameが定義されています(作成された場所、つまりxmlのタグ名)。

動的オブジェクトへの逆シリアル化によって得られる唯一のことは、それらのすべてのプロパティを含むだけのある種の動的型を持つことになります。

XMLをデータベースに保存する場合、XMLを動的オブジェクトに逆シリアル化することはありません。代わりに、XMLドキュメントオブジェクトモデル(XmlDocument?)を使用して読み取り、データベースに保存します。そうしないと、すべての文字列プロパティを持つオブジェクトが作成され、それらが保存されることになります。オブジェクトに逆シリアル化するための単なる冗長な手順のようです。

さらに、(回答で示唆されているように)動的オブジェクトに逆シリアル化しても、異なるタイプのオブジェクトは提供されません(少なくともXMLのそれらのタイプでは)。

于 2012-11-12T23:56:21.687 に答える