C# 仅反序列化XML中的特定项并添加到列表

C# 仅反序列化XML中的特定项并添加到列表,c#,xml,serialization,C#,Xml,Serialization,我有一个包含多个项的XML文件,我希望一次只反序列化一个特定项,而不是所有项,并将其添加到列表中 使用中的示例,如何仅反序列化产品,其中Id=2,并将其添加到产品列表 班级: public class Product { public int Id { get; set; } public string Name { get; set; } } 代码: void foo() { string xmlString=“1我的XML产品2我的第二个产品”; XmlSerializer

我有一个包含多个项的XML文件,我希望一次只反序列化一个特定项,而不是所有项,并将其添加到列表中

使用中的示例,如何仅反序列化
产品
,其中
Id=2
,并将其添加到
产品列表

班级:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}
代码:

void foo()
{
string xmlString=“1我的XML产品2我的第二个产品”;
XmlSerializer serializer=新的XmlSerializer(类型(列表),新的XmlRootAttribute(“产品”);
StringReader StringReader=新的StringReader(xmlString);
List productList=(List)序列化程序。反序列化(stringReader);
}

在这里,您应该使用StringReader创建
XmlReader
,并读取元素的子树。这可以通过
ReadSubtree
方法实现

    public static void Main(string[] args)
    {
        string xmlString = "<Products><Product><Id>1</Id><Name>My XML product</Name></Product><Product><Id>2</Id><Name>My second product</Name></Product></Products>";

        XmlSerializer serializer = new XmlSerializer(typeof(List<Product>), new XmlRootAttribute("Products"));
        List<Product> productList = new List<Product>();

        using (StringReader stringReader = new StringReader(xmlString))
        using (XmlReader xmlReader = XmlReader.Create(stringReader))
        {
            xmlReader.ReadToDescendant("Products");
            productList = (List<Product>)serializer.Deserialize(xmlReader.ReadSubtree());
        }

    }
publicstaticvoidmain(字符串[]args)
{
string xmlString=“1我的XML产品2我的第二个产品”;
XmlSerializer serializer=新的XmlSerializer(类型(列表),新的XmlRootAttribute(“产品”);
List productList=新列表();
使用(StringReader StringReader=new StringReader(xmlString))
使用(XmlReader=XmlReader.Create(stringReader))
{
xmlReader.ReadToDescendant(“产品”);
productList=(List)序列化程序。反序列化(xmlReader.ReadSubtree());
}
}

您可以使用XDocument类查询Xml:

StringReader stringReader = new StringReader(xmlString);
XDocument document = XDocument.Load(stringReader);

var node = document.Descendants("Product").FirstOrDefault(p => p.Descendants("Id").First().Value == "2");
if(node != null)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Product));
    var xmlReader = new StringReader(node.ToString());
    Product result = serializer.Deserialize(xmlReader) as Product;
}

诚然,这是一个快速而肮脏的解决方案,在某些情况下可能需要进一步分析。

为什么不使用LINQ to XML或其他XML解析器?谢谢,但该代码反序列化了这两项,就像我的示例中的代码一样,而不仅仅是
Id=2
的代码。
StringReader stringReader = new StringReader(xmlString);
XDocument document = XDocument.Load(stringReader);

var node = document.Descendants("Product").FirstOrDefault(p => p.Descendants("Id").First().Value == "2");
if(node != null)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Product));
    var xmlReader = new StringReader(node.ToString());
    Product result = serializer.Deserialize(xmlReader) as Product;
}