将XML反序列化为C#对象

4
如何使用C#将下面的CatalogProduct标签反序列化为我的CatalogProduct对象?
<?xml version="1.0" encoding="UTF-8"?>
<CatalogProducts>
    <CatalogProduct Name="MyName1" Version="1.1.0"/>
    <CatalogProduct Name="MyName2" Version="1.1.0"/>
</CatalogProducts>

注意,我没有CatalogProducts对象,因此在反序列化时希望跳过该元素。
谢谢。

这不是反序列化,因为它不是序列化的结果。我可以说这只是解析或根据 XML(自己的结构)创建对象。不是吗? - abatishchev
5个回答

5
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
        };

嗨,Chris,我不能使用XmlSerializer对象吗?这样我就可以向我的XML文档添加属性,它们将自动设置为我的C#对象中的属性了。 - Bob
是的,这需要使用序列化程序进行序列化和反序列化。假设该XML文档没有序列化,这种解决方案就是解析XML文档的Linq to Xml方式。 - Chris Conway

4

只是为了让您知道,这里有一个关于如何真正序列化和反序列化对象的示例:

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);
    }
}

2

规范的方法是使用xsd.exe 工具两次。首先,根据你的示例 XML 创建模式,如下所示:

xsd.exe file.xml 将生成 file.xsd。

然后:

xsd.exe /c file.xsd 将生成 file.cs。

file.cs 将是你可以使用此处任何一种易于找到的技术之一进行 XML 反序列化的对象,例如 this


嗨,Jesse,我已经有了我的CatalogProduct对象。我只需要知道使用LINQ to XML或其他方法抓取XML中特定元素的代码,然后进行序列化。我不想使用xsd.exe文件。谢谢。 - Bob

0
假设您的对象看起来像这样:
    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 提供真正的对象图序列化,但我没有展示。

0

没有 "CatalogProduct" 对象,我认为这很困难,也许使用 .net 4.0 的动态类型是可能的,但我不确定。

我知道的唯一方法是利用 XmlSerializer 类和 Deserialize 方法,但你需要 CatalogProduct 对象。

我希望以下链接有用: Link


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接