C# - XML 反序列化 - 忽略具有属性的元素
C# - XML deserialization - ignore elements with attribue
我需要将一些 xml 反序列化为 C# 对象。这是我的 class:
[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" 属性值的类别元素。有什么办法可以做到这一点吗?
要以 Microsoft 的方式执行此操作,您需要为要序列化的 class 实现一个 IXmlSerializable
接口:
https://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable(v=vs.110).aspx
这将需要您进行一些手动编码 - 您基本上必须实施 WriteXml
和 ReadXml
方法,然后您会得到一个 XmlWriter
和一个 XmlReader
界面分别做你需要做的。
请记住让您的 class 保持原子性,这样您就不会最终对整个对象图进行自定义序列化(呃)。
另一种方法是将 属性 命名为带有 [XmlElement("category")] 属性的 ImportCategories,然后将类别作为 属性 returns使用 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
,并且可能不希望 to/need 以其他方式序列化。
我需要将一些 xml 反序列化为 C# 对象。这是我的 class:
[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" 属性值的类别元素。有什么办法可以做到这一点吗?
要以 Microsoft 的方式执行此操作,您需要为要序列化的 class 实现一个 IXmlSerializable
接口:
https://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable(v=vs.110).aspx
这将需要您进行一些手动编码 - 您基本上必须实施 WriteXml
和 ReadXml
方法,然后您会得到一个 XmlWriter
和一个 XmlReader
界面分别做你需要做的。
请记住让您的 class 保持原子性,这样您就不会最终对整个对象图进行自定义序列化(呃)。
另一种方法是将 属性 命名为带有 [XmlElement("category")] 属性的 ImportCategories,然后将类别作为 属性 returns使用 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
,并且可能不希望 to/need 以其他方式序列化。