Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-XML反序列化-忽略具有属性的元素_C#_Xml Serialization - Fatal编程技术网

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

C#-XML反序列化-忽略具有属性的元素,c#,xml-serialization,C#,Xml Serialization,我需要将一些xml反序列化为c#对象。这是我的班级: [XmlRoot("root")] [Serializable] public class MyRoot { [XmlElement("category")] public List<Category> Categories { get; set; } } 但是我想忽略一些具有指定“id”属性值的Category元素。有什么方法可以做到这一点吗?要以Microsoft的方式做到这一点,您需要为要序

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

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

但是我想忽略一些具有指定“id”属性值的Category元素。有什么方法可以做到这一点吗?

要以Microsoft的方式做到这一点,您需要为要序列化的类实现一个
IXmlSerializable
接口:

这将需要您进行一些手工编码-您基本上必须实现
WriteXml
ReadXml
方法,并且您分别获得一个
XmlWriter
和一个
XmlReader
接口来完成您需要做的事情


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

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

这将需要您进行一些手工编码-您基本上必须实现
WriteXml
ReadXml
方法,并且您分别获得一个
XmlWriter
和一个
XmlReader
接口来完成您需要做的事情


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

另一种方法是使用[XmlElement(“category”)将类似ImportCategories的属性命名为属性,然后将类别作为属性,该属性使用LINQ从ImportCategories返回筛选后的列表


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

另一种方法是使用[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());
HashSet badIds=newhashset();
添加(“1”);
添加(“不包括我”);
XDocument xd=XDocument.Load(新的StringReader(client.DownloadString(XmlUrl));
var badCategories=xd.Root.subjections(“category”)。其中(x=>badIds.Contains((string)x.Attribute(“id”));
if(badCategories!=null&&badCategories.Any())
badCategories.Remove();
MyRoot root=(MyRoot)新的XmlSerializer(typeof(MyRoot));

您可以在生成的集合上执行类似的操作,但完全有可能您不序列化
id
,也可能不想/不需要序列化。

实现
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());
HashSet badIds=newhashset();
添加(“1”);
添加(“不包括我”);
XDocument xd=XDocument.Load(新的StringReader(client.DownloadString(XmlUrl));
var badCategories=xd.Root.subjections(“category”)。其中(x=>badIds.Contains((string)x.Attribute(“id”));
if(badCategories!=null&&badCategories.Any())
badCategories.Remove();
MyRoot root=(MyRoot)新的XmlSerializer(typeof(MyRoot));

您可以在生成的集合上执行类似的操作,但完全有可能您不序列化
id
,也可能不想/不需要序列化。

只需对反序列化对象进行后期处理(浏览列表,检查id并删除)。如果您不能这样做,请解释原因。这是单行道还是以后需要反序列化XML?只需对反序列化对象进行后期处理(遍历列表,检查id并删除)。如果您不能这样做,那么请解释原因。这是单行道还是以后需要反序列化XML?谢谢!我只是想知道,是否有一些c#属性可以做这件事。没有自定义
IXmlSerializable
就不行,谢谢!我只是想知道,是否有一些c#属性可以做这件事。没有自定义
IXmlSerializable