1

我正在尝试使用 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; }
}

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

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

谢谢,纳雷什

4

2 回答 2

6

.NET 的 XML 序列化程序的默认行为是将属性序列化为 XML 元素。该属性的值成为该属性对应的 XML 元素的内部文本。也就是说,如果你序列化你的对象,它看起来像这样:

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

在您的情况下,您需要指示序列化程序放入Price.Amount一个属性并写入Price.ValuePrice内部文本。最简单的方法是使用适当的 [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> () ;
...
于 2013-06-04T04:57:41.197 回答
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; }
        }
于 2013-06-04T05:21:55.287 回答