2012-03-28 14 views
2

私のクラスをXMLに変換して元に戻す方法を探しています。C#でシリアル化 - 独自の形式で?

これはシリアル化でも機能しますが、残念ながら全く別の問題が必要です。

残念ながら、シリアライザのコンバートに関するいくつかのことが実際に時々見つかっていますが、残念ながらほとんど目標がないようです。

私はすべての変数を読むことができなければならないと思っていましたが、ハードコードされた手作業で入力する必要はありません。たぶん誰かが私のためのヒントを持っています。

これは、クラスの1の短いテストです:

public class C_20 //GENERAL DATA 
{ 
    public string OBJAP = "test"; 
    public string AKTYP = "1"; 
    public string RLTP1 = "2"; 
    public string ROLE1 = "3"; 
} 

そして、私はこのフォーマットさXML必要があります:私は私がそうでなければ、数千行を記述する必要が誰かを助けることを願って

<ENTITY name="C_20"> 
    <ATTRIBUTES> 
     <ATTRIBUTE name="OBJAP">test</ATTRIBUTE> 
     <ATTRIBUTE name="AKTYP">1</ATTRIBUTE> 
     <ATTRIBUTE name="RLTP1">2</ATTRIBUTE> 
     <ATTRIBUTE name="ROLE1">3</ATTRIBUTE> 
    </ATTRIBUTES> 
</ENTITY> 

を明らかに非常にエラーが起こりやすいでしょう。

+1

を使用してL.B BY

EDIT

同じ考え、? –

+0

チップをありがとう、残念ながら私は仕事中のコンピュータにはいないが、自宅で私はXMLコード自体を書くように手を挙げる必要はなかった。あなたはそれを書いています、それは私の上に落ちた、私はちょうど離れてチェックし、見て...ありがとう、それを修理しません...今私は私が必要なものがあります:)ありがとうagain – Szandor

答えて

2

あなたはシリアライザにオブジェクトのインスタンスを渡したいようにそれは私に聞こえる、そしてそのシリアライザは自動的にインスタンスのすべてのプロパティを列挙し、XML文字列としてそれらを返してきました。

良いニュース:これを行うにはいくつかの方法があります。実行時にオブジェクトを検査するのに役立つすべての種類の型を含むSystem.Reflection名前空間をチェックアウトしたい場合があります。少なくとも正しい方向にあなたを指している必要があり

public string GetXml<T>(T instance) 
{ 
    var type = typeof(T); 
    var properties = type.GetProperties(); 
    var builder = new System.Text.StringBuilder(); 

    builder.AppendFormat("<{0}>", type.Name); 

    foreach (var property in properties) 
    { 
     var name = property.Name; 
     var value = property.InvokeMember(name, 
              BindingFlags.DeclaredOnly |   
              BindingFlags.Public | 
              BindingFlags.NonPublic | 
              BindingFlags.Instance | 
              BindingFlags.GetProperty, 
              null, 
              instance, 
              null); 
     builder.AppendFormat("<{0}>{1}</{0}>", 
          name, 
          value);   
    } 

    builder.AppendFormat("</{0}>", type.Name); 

    return builder.ToString(); 
} 

:シンプルな、強引な例として

。あなたは本当に子供のコレクションと同じレベルで、テキストノードとしてC_20ことを必要Linq2Xml

public static string GetXml<T>(T obj) 
{ 
    Type t = typeof(T); 
    XElement xElem = new XElement("ENTITY"); 
    xElem.Add(t.Name, 
       new XElement("ATTRIBUTES", 
          t.GetFields() 
          .Select(f => new XElement("ATTRIBUTE", 
                 new XAttribute("name",f.Name), 
                 f.GetValue(obj))) 
          .ToArray()) 
    ); 

    return xElem.ToString(); 
} 
+0

私はあなたの答えを編集しました。あなたが好きでない場合は、それを削除しても構いません。 –

+0

ニース編集;より読みやすいようにちょっと整理しました。私は一般的に、LINQ to XMLに精通していない人がいるので、私はブルートフォース方法を提供したと仮定します。これはLINQ to XMLの初心者です。 :) –

+0

最初の例は実行しなかったが、2番目の例はとにかく前に正しくテストしたかった。私はあなたが結果として小さなコードでそれを完璧にすることができたことに感心しました。 私にはあなたの絶対的な完璧な例がありがとうございます。最初のおかげで、私は再び輸入を行うことができます。 – Szandor

4

お客様の基準に基づいて、IXmlSerializableC_20に実装します。あなたが探しているXMLを作成する方法については、ここで大いに読んでいます。

Proper way to implement IXmlSerializable?

+0

ありがとうそれはアウト。私は別の設定にXMLSerializeしてそれを探していましたが、私はそれがその近くにある可能性があるという証拠は見つけませんでした。 この例は私が探していたものではありません。 – Szandor

関連する問題