将XML反序列化为C#对象
如何使用C#将以下CatalogProduct标签解除为我的CatalogProduct对象?将XML反序列化为C#对象
<?xml version="1.0" encoding="UTF-8"?>
<CatalogProducts>
<CatalogProduct Name="MyName1" Version="1.1.0"/>
<CatalogProduct Name="MyName2" Version="1.1.0"/>
</CatalogProducts>
注意我没有CatalogProducts对象,因此要跳过该元素拉回时,进入反序列化
感谢
var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<CatalogProducts>" +
"<CatalogProduct Name=\"MyName1\" Version=\"1.1.0\"/>" +
"<CatalogProduct Name=\"MyName2\" Version=\"1.1.0\"/>" +
"</CatalogProducts>";
var document = XDocument.Parse(xml);
IEnumerable<CatalogProduct> catalogProducts =
from c in productsXml.Descendants("CatalogProduct")
select new CatalogProduct
{
Name = c.Attribute("Name").Value,
Version = c.Attribute("Version").Value
};
嗨克里斯,我不能使用XmlSerializer对象,所以我可以添加属性到我的XML文档,他们将automatiaclly设置为我的c#对象中的属性? – Bob 2010-11-09 15:24:19
是的,这需要使用序列化器来序列化和反序列化。这种解决方案是假定xml未被序列化的,解析xml文档的Linq to Xml方式。 – 2010-11-09 15:46:44
没有“CatalogProduct”对象,我认为这是非常困难的,也许与动态类型的.NET 4.0是可能的,但我不知道。
我知道的唯一方法是利用带有Deserialize方法的XmlSerializer类,但需要对象CatalogProduct。
我希望下面的链接是有用的: http://blogs.msdn.com/b/alexghi/archive/2008/12/22/using-anonymous-types-to-deserialize-json-data.aspx
假设你CatalogProduct
物体看起来是这样的:
public class CatalogProduct {
public string Name;
public string Version;
}
我想的LINQ to XML将是最简单和最快的方式为您
var cps1 = new[] { new CatalogProduct { Name = "Name 1", Version = "Version 1" },
new CatalogProduct { Name = "Name 2", Version = "Version 2" } };
var xml = new XElement("CatalogProducts",
from c in cps1
select new XElement("CatalogProduct",
new XAttribute("Name", c.Name),
new XAttribute("Version", c.Version)));
// Use the following to deserialize you objects
var cps2 = xml.Elements("CatalogProduct").Select(x =>
new CatalogProduct {
Name = (string)x.Attribute("Name"),
Version = (string)x.Attribute("Version") }).ToArray();
请注意,.NET提供了真正的对象图序列化,我没有显示
只是为了您的信息,这里是如何真正的序列化和反序列化对象的示例:
private CatalogProduct Load()
{
var serializer = new XmlSerializer(typeof(CatalogProduct));
using (var xmlReader = new XmlTextReader("CatalogProduct.xml"))
{
if (serializer.CanDeserialize(xmlReader))
{
return serializer.Deserialize(xmlReader) as CatalogProduct;
}
}
}
private void Save(CatalogProduct cp)
{
using (var fileStream = new FileStream("CatalogProduct.xml", FileMode.Create))
{
var serializer = new XmlSerializer(typeof(CatalogProduct));
serializer.Serialize(fileStream, cp);
}
}
这不是一个反序列化,因为它不是序列化的结果。我可以说这只是一个解析或创建一个基于xml(你自己的结构)的对象。不是吗? – abatishchev 2010-11-09 15:22:58