Jay*_*Jay 6 c# xml attributes poco deserialization
我希望使用XmlSerializer对象将嵌套元素中的多个XML属性映射到单个POCO类中.
XML
<products grand-total="100">
<one price="50" />
<two price="20" />
<tree price="30" />
</products>
Run Code Online (Sandbox Code Playgroud)
POCO
public class Product
{
public int GrandTotal { get; set; }
public int OnePrice { get; set; }
public int TwoPrice { get; set; }
public int ThreePrice { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
C#
var doc = XDocument.Load("XmlDoc.xml");
var serializer = new XmlSerializer(typeof(Product));
var reader = doc.Root.CreateReader();
var temp = (Product)serializer.Deserialize(reader);
Run Code Online (Sandbox Code Playgroud)
如果有人知道如何做到这一点,那将是非常棒的.
谢谢.
如果您被锁定到此 XML 模式,这将序列化或反序列化您的 XML 和对象数据:
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
public class ProductsViewModel
{
public string Xml { get; set; }
public Product Poco { get; set; }
public ProductsViewModel()
{
Xml = Serialize(new Product());
Poco = (Product)Deserialize(Xml, typeof(Product));
}
public class Price
{
[XmlAttribute(AttributeName = "price")]
public int Value { get; set; }
}
[XmlRoot(ElementName = "products")]
public class Product
{
[XmlAttribute(AttributeName = "grand-total")]
public int GrandTotal { get; set; }
[XmlElement(ElementName = "one")]
public Price OnePrice { get; set; }
[XmlElement(ElementName = "two")]
public Price TwoPrice { get; set; }
[XmlElement(ElementName = "tree")]
public Price ThreePrice { get; set; }
public Product()
{
GrandTotal = 100;
OnePrice = new Price { Value = 50 };
TwoPrice = new Price { Value = 20 };
ThreePrice = new Price { Value = 30 };
}
}
private string Serialize(object obj)
{
var serializer = new XmlSerializer(obj.GetType());
using (var stringWriter = new StringWriter())
{
serializer.Serialize(stringWriter, obj);
return stringWriter.ToString();
}
}
private object Deserialize(string serializedObj, Type type)
{
var serializer = new XmlSerializer(type);
using (var stringReader = new StringReader(serializedObj))
using (var xmlTextReader = new XmlTextReader(stringReader))
{
return serializer.Deserialize(xmlTextReader);
}
}
}
Run Code Online (Sandbox Code Playgroud)
假设 POCO 是您可以修改的:
[Serializable]
[XmlRoot("one")]
public class OnePrice
{
[XmlAttribute("price")]
public int price { get; set; }
}
[Serializable]
[XmlRoot("two")]
public class TwoPrice
{
[XmlAttribute("price")]
public int price { get; set; }
}
[Serializable]
[XmlRoot("three")]
public class ThreePrice
{
[XmlAttribute("price")]
public int price { get; set; }
}
[Serializable]
[XmlRoot("products")]
public class Product
{
[XmlAttribute("grand-total")]
public int GrandTotal { get; set; }
[XmlElement("one")]
public OnePrice OnePrice { get; set; }
[XmlElement("two")]
public TwoPrice TwoPrice { get; set; }
[XmlElement("three")]
public ThreePrice ThreePrice { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果您可以修改 XML,则可以通过不使用属性而仅使用元素(至少对于一、二和三)来更轻松地完成此操作。
归档时间: |
|
查看次数: |
11113 次 |
最近记录: |