2011-12-16 9 views
1

現在、XMLファイルを読み取るためにLINQクエリを使用しています。C#XmlSerializer:値を保持し、要素ラベルをオーバーライドします。

<MyObjects> 
    <MyObject> 
     <MyElement>some_text</MyElement> 
     <MyOtherElement>some_more_text</MyOtherElement> 
    </MyObject> 
</MyObjects> 

カスタムHistoryStringプロパティを含むカスタムオブジェクトのリストに変換します。 HistoryStringには、2つの文字列、currentValueおよびpreviousValueが含まれています。何がneatestおよび/またはほとんどのようになります。

このカスタムを書くためにXmlSerializerを使用してXMLファイルに戻ってオブジェクトをする場合、出力はかなり明らかに追加のタグが含まれている以外のすべてが素晴らしい作品は

<MyObjects> 
    <MyObject> 
     <MyElement> 
        <currentValue>some_text</currentValue> 
        <previousValue>some_text</previousValue> 
     </MyElement> 
     <MyOtherElement> 
        <currentValue>some_more_text</currentValue> 
        <previousValue>some_more_text</previousValue> 
     </MyOtherElement> 
    </MyObject> 
</MyObjects> 

Q、すなわちこの基本的な違いに基づいて、XMLを同じ形式で読み書きする効率的な方法ですか?

いくつかの初期のアイデア:

1)マーク[System.Xml.Serialization.XmlIgnore]previousValueプロパティは、<currentValue></currentValue>

2の痕跡をすべて削除書き込まれるXML文字列をスイープ)既存のファイルを開き、手動で更新/削除/追加を行う - これは確かにより長い間巻き込まれています。

3)HistoryStringは、ToString()の動作と同様に、それぞれのプロパティをシリアル化するのではなく、自動的にcurrentValueに解決されますか?

便利なMSDNの記事herehereなど、これに関するいくつかの調査を行っていますが、この問題を解決する他の属性はありません。これが可能かどうかはまだ分かりません。何か案は?

答えて

1

これは別の考えです。あなたはそのようなあなたのクラスを定義する場合:

[Serializable] 
public class MyObject 
{ 
    [XmlElement(ElementName = "MyElement")] 
    public string CurrentValueElement 
    { 
     get 
     { 
      return Element.CurrentValue; 
     } 

     set 
     { 
      Element = new MyElement 
          { 
           CurrentValue = value, PreviousValue = value 
          }; 
     } 
    } 

    [XmlElement(ElementName = "MyOtherElement")] 
    public string CurrentValueOtherElement 
    { 
     get 
     { 
      return OtherElement.CurrentValue; 
     } 
     set {} 
    } 

    [XmlIgnore] 
    public MyElement Element { get; set; } 

    [XmlIgnore] 
    public MyElement OtherElement { get; set; } 

} 

をオブジェクトがシリアル化されるときに、出力XMLはまさにあなたの例のようになります。あなたはこのようCurrentValueElement/CurrentValueOtherElementセッターを拡張する場合

また、:

[XmlElement(ElementName = "MyElement")] 
public string CurrentValueElement 
{ 
    get 
    { 
     return Element.CurrentValue; 
    } 

    set 
    { 
     Element = new MyElement 
         { 
          CurrentValue = value, PreviousValue = value 
         }; 
    } 
} 

その後、LINQに頼るに必要とせずに、直接あなたのオブジェクトをデシリアライズするためにXmlSerializerを使用することができます。

+0

は治療のように動作します、ありがとう:) –

0

なぜ元のスキーマを使用してシリアル化し、現在の値のみを使用して履歴から変換されたオブジェクトのリストをそれに追加しないのはなぜですか?

from h in HistoryEntryList 
select new OriginalEntry{ field = h.field.current_value, ... }; 
+0

私にはうってつけの音ですが、LINQにはかなり新しくなっています。 現在、XElement.Load(path)を実行している途中でクエリを作成していますが、XmlSerializerを使用してStreamWriterにシリアル化しています。 –

+0

元のxmlのスキーマ(linqを使ってクエリを実行してから疑問がある)があれば、XmlSerializerを使用してリストをxmlに変換することができます。ちょうどhsitoryリストを "元の "オブジェクトは、linqの上にあなたのために行います。 – mmix

関連する問題