繁体   English   中英

C#-XML反序列化-忽略具有属性的元素

[英]C# - XML deserialization - ignore elements with attribue

我需要反序列化一些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元素。 有什么办法可以做到这一点?

另一种方法是使用[XmlElement(“ category”)]属性获得一个名为ImportCategories之类的属性,然后将Categories作为属性,使用LINQ从ImportCategories返回过滤列表。

然后您的代码将进行反序列化,然后使用root.Categories。

实现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进行序列化,并且可能不想这样做。

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

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

这将需要您进行一些手工编码-您基本上必须实现WriteXmlReadXml方法,并且分别获得XmlWriterXmlReader接口,以执行所需的操作。

只要记住让您的类保持原子性就可以了,这样您就不会对整个对象图(ugh)进行自定义序列化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM