2011-12-16 61 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