仅从XML反序列化特定项并添加到列表

时间:2016-10-12 20:29:58

标签: c# xml serialization

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

使用this site中的示例,如何仅对Product Id=2进行反序列化,并将其添加到productList

班级:

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

代码:

void foo()
{
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"));

StringReader stringReader = new StringReader(xmlString);

List<Product> productList = (List<Product>)serializer.Deserialize(stringReader);
}

2 个答案:

答案 0 :(得分:2)

您可以使用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;
}

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

答案 1 :(得分:1)

这是有效的,您应该使用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());
        }

    }