我正在尝试使用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; }
}
通过使用上面的代码,我得到了产品对象,但价格对象的属性总是反序列化为空值。
有人可以告诉我我错过了什么。
谢谢, 纳雷什
答案 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; }
}