2015-03-16 2 views
4

Я ищу для сопоставления нескольких атрибутов XML в вложенных элементах в один класс POCO с помощью объекта XmlSerializer.Сопоставление XML с классами в C#

XML

<products grand-total="100"> 
    <one price="50" /> 
    <two price="20" /> 
    <tree price="30" /> 
</products> 

ПОКО

public class Product 
{ 
    public int GrandTotal { get; set; } 
    public int OnePrice { get; set; } 
    public int TwoPrice { get; set; } 
    public int ThreePrice { get; set; } 
} 

C#

var doc = XDocument.Load("XmlDoc.xml"); 
var serializer = new XmlSerializer(typeof(Product)); 
var reader = doc.Root.CreateReader(); 
var temp = (Product)serializer.Deserialize(reader); 

Было бы удивительным, если кто-нибудь знает, как я могу сделать это.

Спасибо.

+0

Вы собираетесь должны реализовать 'IXmlSerializable' в продукте и вручную разобрать XML , или использовать Linq для XML. – SwDevMan81

ответ

1

Предполагая ПОКО, что вы можете изменить:

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

Если вы можете изменить XML, вы можете сделать это немного более легко, не используя атрибуты и просто придерживаться элементов (по крайней мере, для одного, Два и Три).

3

Если вы заперты в этой 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); 
     } 
    } 
} 
Смежные вопросы