C#将XML反序列化为对象

时间:2013-06-04 04:44:40

标签: c# .net serialization xml-serialization

我正在尝试使用C#将xml反序列化为对象。

这是我的XML。

<Products>
  <Product>
    <Name>Test</Name>
    <Price Amount="12.95">£ 12.95</Price>
  </Product>
</Products>

这是我的代码。

class Program
{
    static void Main(string[] args)
    {
        var filePath = @"C:\Eastpoint\TestApps\TestHunterSuppliers\bin\Debug\Sample.xml";
        var reader = new XmlTextReader(filePath);
        var serializer = new XmlSerializer(typeof(Products));
        var products = (Products)serializer.Deserialize(reader);
        Console.WriteLine(products.Product.Name);
        Console.WriteLine(products.Product.Price.Amount);
    }
}

public class Products
{
    public Product Product { get; set; }
}

public class Product
{
    public string Name { get; set; }
    public Price Price { get; set; }
}

public class Price
{
    public string Amount { get; set; }
    public string Value { get; set; }
}

通过使用上面的代码,我得到了产品对象,但价格对象的属性总是反序列化为空值。

有人可以告诉我我错过了什么。

谢谢, 纳雷什

2 个答案:

答案 0 :(得分:6)

.NET's XML serializer的默认行为是将属性序列化为XML元素。属性的值成为与属性对应的XML元素的内部文本。也就是说,如果您序列化了对象,它将如下所示:

<Products>
  <Product>
    <Name>Test</Name>
    <Price>
      <Amount>12.95</Amount>
      <Value>£ 12.95</Value>
    </Price>
  </Product>
</Products>

在您的情况下,您需要指示序列化程序将Price.Amount放入属性并将Price.Value写为Price的内部文本。最简单的方法是使用适当的[XmlXxx]属性来装饰需要非默认序列化的属性:

...
[XmlAttribute]
public string Amount { get ; set ; }

[XmlText]
public string Value { get ; set ; }
...

顺便说一句,如果您的Products应该包含多个产品,则需要修改代码,如下所示:

...
[XmlElement ("Product")]
public Product[] All { get ; set ; }
...

该属性指示序列化程序不要创建<All>元素来保存单个产品的元素。您也可以使用其他集合,例如List<Product>,但您应该事先创建它们:

...
[XmlElement ("Product")]
public readonly List<Product> All = new List<Product> () ;
...

答案 1 :(得分:0)

您可以使用FileStream

制作原始测试代码

经过测试的代码示例:

            var filePath = @"C:\Eastpoint\TestApps\TestHunterSuppliers\bin\Debug\Sample.xml";
            var serializer = new XmlSerializer(typeof(Products));

            //Setting dummy object to create the xml
            Products myProducts = new Products { Product = new Product { Name = "Papers", Price = new Price { Amount = "10", Value = "20" } } };

            var strWrite = new FileStream(filePath, FileMode.Create);
            serializer.Serialize(strWrite, myProducts);
            strWrite.Close();


            //////////////////////////////

            var strRead = new FileStream(filePath, FileMode.Open);
            var products = (Products)serializer.Deserialize(strRead);
            strRead.Close();

            Console.WriteLine(products.Product.Name);
            Console.WriteLine(products.Product.Price.Amount);

并将价格作为XML文档中的属性获取:

        public class Price
        {
            [XmlAttribute]
            public string Amount { get; set; }
            public string Value { get; set; }
        }