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