C# 如何在不定义父节点的情况下反序列化XML文件?

C# 如何在不定义父节点的情况下反序列化XML文件?,c#,xml-serialization,C#,Xml Serialization,我知道有很多关于xml文件反序列化的内容,但到目前为止我还没有找到解决方案。我的XML看起来像这样 <Data> <Products> <Product name="product1" brand="brand1"> <ProductValues> <ProductValue name="price" value="100"/>

我知道有很多关于xml文件反序列化的内容,但到目前为止我还没有找到解决方案。我的XML看起来像这样

<Data>
    <Products>
        <Product name="product1" brand="brand1">
            <ProductValues>
                <ProductValue name="price" value="100"/> 
                <ProductValue name="stock" value="23"/>
            </ProductValues>
        </Product>
        <Product name="product2" brand="brand1">
            <ProductValues>
                <ProductValue name="price" value="100"/> 
                <ProductValue name="stock" value="23"/>
            </ProductValues>
        </Product>
        <Product name="product2" brand="brand1">
            <ProductValues>
                <ProductValue name="price" value="100"/> 
                <ProductValue name="stock" value="23"/>
            </ProductValues>
        </Product>
    </Products>

    ... <!-- And more products -->

</Data>
XmlSerializer serializer = new XmlSerializer(typeof(Data));
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
    Data data = (Data)serializer.Deserialize(stream);
}
如果我创建一个名为Data的新类,它有一个字段publicproduct[]products,并且我像这样反序列化,那么一切都可以找到

<Data>
    <Products>
        <Product name="product1" brand="brand1">
            <ProductValues>
                <ProductValue name="price" value="100"/> 
                <ProductValue name="stock" value="23"/>
            </ProductValues>
        </Product>
        <Product name="product2" brand="brand1">
            <ProductValues>
                <ProductValue name="price" value="100"/> 
                <ProductValue name="stock" value="23"/>
            </ProductValues>
        </Product>
        <Product name="product2" brand="brand1">
            <ProductValues>
                <ProductValue name="price" value="100"/> 
                <ProductValue name="stock" value="23"/>
            </ProductValues>
        </Product>
    </Products>

    ... <!-- And more products -->

</Data>
XmlSerializer serializer = new XmlSerializer(typeof(Data));
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
    Data data = (Data)serializer.Deserialize(stream);
}
我不想为此创建一个额外的类,也不想创建一个额外的字段,而只是使用数组类型XmlSerializer serializer=new XmlSerializertypeofProduct[]实例化序列化程序;接收本地产品[]。但是如果这样做,我会使用Xml Linq得到错误:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            List<Product> products = doc.Descendants("Product").Select(x => new Product() {
                name = (string)x.Attribute("name"),
                brand = (string)x.Attribute("brand"),
                ProductValues = x.Descendants("ProductValue")
                    .GroupBy(y => (string)y.Attribute("name"), z => (string)z.Attribute("value"))
                    .ToDictionary(y => y.Key, z => z.FirstOrDefault())
            }).ToList();

        }
    }
    public class Product
    {
        public string name { get; set; }
        public string brand { get; set; }
        public Dictionary<string, string> ProductValues { get; set; }
    }

}

正如@Rand Random指出的一个可能的问题,我看了看这个问题,最后发现它可以和


谢谢但是我让它工作了。你真的需要序列化使用的所有不必要的类吗?我的代码只使用一个类。别忘了用using包装XmlReader以释放文件句柄。