2017-04-26 19 views
0

我有一個以錯誤的方式用XmlElement裝飾的類,但它也具有可以讓我識別我需要的字段的屬性。XmlSerializer在C#中,用一個特定的屬性反序列化一個具有相同名稱的多個XmlElement裝飾的類?

我只能修改[IWantToSerializeThisAttribute]並將其他屬性添加到MySerializableClass,因爲對屬性名稱或XmlElement名稱的任何修改都會涉及繁重的代碼維護。

這裏是如何類已經被定義爲:

[XmlRoot("ARandomXmlRoot")] 
    public class MySerializableClass 
    { 

     //CAMPI DIR_DOCUMENTI 
     //[MetadatoDocumentoAlfresco] è un attributo che serve per selezionare i campi per l'aggiornamento dati massivo su alfresco 
     [IWantToSerializeThisAttribute] 
     [XmlElement("DocumentCode")] 
     public string DOC_CODE { get; set; } 

     [IWantToSerializeThisAttribute] 
     [XmlElement("DocumentId")] 
     public string DOC_ID { get; set; } 

     [XmlElement("DocumentCode")] 
     public string DOC_CODE_FOR_EMPLOYEES { get; set; } 

     [XmlElement("DocumentId")] 
     public string DOC_ID_FOR_EMPLOYEES { get; set; } 

    } 

現在,如果我做

XmlSerializer.Deserialize(xmlString, typeof(MySerializableClass)); 

我將最有可能得到一個錯誤,因爲XmlSerializer的是找到2倍

[XmlElement("DocumentCode")] 

並認爲它是重複的標籤。

反正我有一個

[IWantToSerializeThisAttribute] 

,使2個屬性不同。

我可以告訴XmlSerializer.Deserialize只捕獲和確定「IwantToSerializeThisAttribute」屬性並忽略其他屬性嗎?

我不能使用XmlOverrideAttributes更改序列化,但也許有一些方法可以在反序列化過程中完成。

謝謝大家

+0

如果xml標籤發生了兩次比您需要的數組:[XmlElement(「DocumentId」)] public List DOC_ID {get;組; } – jdweng

+0

顯而易見的答案是刪除該屬性,因爲您不希望它被使用。爲什麼你不希望序列化的屬性上有'XmlElement'屬性? –

+0

向我們展示您的xml。 –

回答

1

嘗試使用XmlOverrideAttributes和Reflection。使用LINQ只是爲了縮短它。

這爲我工作:

string XmlString = "<ARandomXmlRoot> XML HERE </ARandomXmlRoot>"; 
      XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 

      //Select fields I DON'T WANT TO SERIALIZE because they throw exception 
      string[] properties = (new MySerializableClass()) 
       .GetType().GetProperties() 
       .Where(p => !Attribute.IsDefined(p, typeof(IWantToSerializeThisAttribute))) 
       .Select(p => p.Name); 

      //Add an XmlIgnore attribute to them 
      properties.ToList().ForEach(field => overrides.Add(typeof(MySerializableClass), field, new XmlAttributes() { XmlIgnore = true })); 

      MySerializableClass doc = new MySerializableClass(); 

      XmlSerializer serializerObj = new XmlSerializer(typeof(MySerializableClass), overrides); 
      using (StringReader reader = new StringReader(xmlString)) 
      { 
       doc = (MySerializableClass)serializerObj.Deserialize(reader); 
      }; 

乾杯

+0

這就是我正在尋找的,因爲允許我僅在需要時纔會執行動態xml序列化/反序列化,不包括字段 – Wasted

0

不知道如果我理解正確的,但讓我嘗試給你一些選項:

我能告訴好歹XmlSerializer.Deserialize只捕獲和確定「IwantToSerializeThisAttribute」屬性並忽略其他屬性?

如果要僅序列化特定屬性,請使用[XmlIgnore]屬性來指定要忽略的屬性。但是,如果由於某種原因(DOC_CODE_FOR_EMPLOYEESDOC_ID_FOR_EMPLOYEES

但是,如果你的意思是,它應該反序列化只能省略,但系列化仍應爲我想想實施IXmlSerializable所有屬性來完成。這樣你可以專門提供你想要如何讀/寫你的XML。

+0

使用XmlAttributeOverrides – Wasted

相關問題