C# - XML反序列化 - 忽略带有attribue的元素

时间:2016-03-08 14:31:13

标签: c# xml-serialization

我需要将一些xml反序列化为c#对象。这是我的班级:

[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”属性值的Category元素。我有办法做到这一点吗?

3 个答案:

答案 0 :(得分:2)

另一种方法是使用[XmlElement(&#34; category&#34;)]属性创建名为ImportCategories的属性,然后将Categories作为属性,使用LINQ从ImportCategories返回已过滤的列表。

然后你的代码将执行deserialisaion然后使用root.Categories。

答案 1 :(得分: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,并且可能不希望/不需要。

答案 2 :(得分:1)

要以Microsoft方式执行此操作,您需要为要序列化的类实现IXmlSerializable接口:

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

您需要进行一些手动编码 - 您基本上必须实施WriteXmlReadXml方法,并获得XmlWriter和{分别为{1}}接口,做你需要做的事。

请记住让你的课程保持原子性,这样你就不会为整个对象图(ugh)进行自定义序列化。