2011-12-16 60 views
1

我目前使用LINQ查詢來讀取XML文件,例如C#XmlSerializer:保留該值,覆蓋元素標籤

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

到包含自定義HistoryString屬性的自定義對象列表。 HistoryString包含2個字符串,currentValuepreviousValue

這一切工作使用的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> 

問:什麼是最巧妙的和/或最基於這種基本差異,以相同的格式讀取和寫入XML的高效方式?

一些初步的想法:

1)標記previousValue財產與[System.Xml.Serialization.XmlIgnore]然後通過將被寫入刪除和<currentValue>所有痕跡</currentValue>

2)打開現有的文件和XML字符串掃手動進行更新/刪除/添加 - 這肯定會更長。

3)HistoryString自動解析爲currentValue而不是序列化其每個屬性的任何方式,類似於ToString()的工作方式?

我已經做了一些研究,包括有用的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 setter方法是這樣的:直接,而無需訴諸LINQ

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

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

然後你就可以使用XmlSerializer進行反序列化你的對象。

0

那麼爲什麼不使用原始模式序列化回來,並使用當前值從歷史記錄中提供轉換對象列表?

例如

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

聽起來對我很好,我對LINQ相當陌生,所以讓我看看我是否可以沙沙作響。 目前我正在做XElement.Load(路徑),然後建立一個查詢的方式,但在回來的路上,只是使用XmlSerializer將它們序列化爲StreamWriter。 – 2011-12-16 12:35:47

+0

如果你有原始xml的模式(我懷疑你使用linq查詢它的時候會這樣做),你可以使用XmlSerializer將列表轉換回xml,它只是將你的hsitory列表轉換爲一個「原創「的對象,這些都是linq爲你所做的。 – mmix 2011-12-16 12:39:38