2016-03-08 211 views
1

我需要將一些xml反序列化爲c#對象。這是我的課:C# - XML反序列化 - 忽略具有屬性的元素

[XmlRoot("root")] 
[Serializable] 
public class MyRoot 
{   
    [XmlElement("category")] 
    public List<Category> Categories { get; set; } 
} 

我反序列化這樣的:

root = (MyRoot)new XmlSerializer(typeof(MyRoot)).Deserialize(new StringReader(client.DownloadString(XmlUrl))); 

但我想忽略與指定的「id」屬性值有一些類別的元素。有什麼辦法可以做到這一點?

+1

只需後處理反序列化的對象(通過列表,檢查id和刪除)。如果你不能這樣做,那麼請解釋原因。 – Sinatr

+0

這是單向街道還是需要稍後反序列化XML? – user1859022

回答

2

實施IXmlSerializable是一條路可走,但也許更簡單的路徑將被簡單地修改XML的時間提前(使用LINQ或XSLT):

HashSet<string> badIds = new HashSet<string>(); 
badIds.Add("1"); 
badIds.Add("excludeme"); 
XDocument xd = XDocument.Load(new StringReader(client.DownloadString(XmlUrl))); 
var badCategories = xd.Root.Descendants("category").Where(x => badIds.Contains((string)x.Attribute("id"))); 
if (badCategories != null && badCategories.Any()) 
    badCategories.Remove(); 
MyRoot root = (MyRoot)new XmlSerializer(typeof(MyRoot)).Deserialize(xd.Root.CreateReader()); 

你可以做同樣的事情在你的結果集合,但是完全有可能你沒有序列化id,並且可能不需要/否則。

+0

謝謝!我只是想知道,如果有一些C#屬性來做到這一點 – petros

+0

不。沒有自定義'IXmlSerializable' –

1

要做到這一點,微軟的方式,就需要實現一個IXmlSerializable接口的類要序列:

https://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable(v=vs.110).aspx

這將需要一些手工編碼你的一部分 - 你基本上必須執行WriteXmlReadXml方法,並且分別獲得XmlWriterXmlReader接口,以執行您需要執行的操作。

只記得保持你的類相當原子,所以你不會最終對整個對象圖(ugh)的自定義序列化。

2

另一種方法是使用[XmlElement(「category」)]屬性命名類似於ImportCategories的屬性,然後將Categories作爲屬性使用LINQ返回ImportCategories中的過濾列表。

然後你的代碼會執行deserialisaion,然後使用root.Categories。

相關問題