Десериализация xml до универсального типа

#c# #xml-deserialization #.net-4.5.2

#c# #xml-десериализация #.net-4.5.2

Вопрос:

Мне нужен класс, который принимает два параметра

1- Тип ==> имя класса 2- строка xml ==> xml-документ в строковом формате.

теперь следующий класс преобразует xml в object, который все работает нормально, но мне нужна окончательная версия как общий тип

Класс преобразователя

 public static partial class XMLPrasing
{
    public static Object ObjectToXML(string xml, Type objectType)
    {
        StringReader strReader = null;
        XmlSerializer serializer = null;
        XmlTextReader xmlReader = null;
        Object obj = null;
        try
        {
            strReader = new StringReader(xml);
            serializer = new XmlSerializer(objectType);
            xmlReader = new XmlTextReader(strReader);
            obj = serializer.Deserialize(xmlReader);
        }
        catch (Exception exp)
        {
            //Handle Exception Code
            var s = "d";
        }
        finally
        {
            if (xmlReader != null)
            {
                xmlReader.Close();
            }
            if (strReader != null)
            {
                strReader.Close();
            }
        }
        return obj;
    }

}
  

в качестве примера класса

 [Serializable]
[XmlRoot("Genders")]
public class Gender
{

    [XmlElement("Genders")]
    public List<GenderListWrap> GenderListWrap = new List<GenderListWrap>();       
}


public class GenderListWrap
{
    [XmlAttribute("list")]
    public string ListTag { get; set; }

    [XmlElement("Item")]
    public List<Item> GenderList = new List<Item>();
}



public class Item
{
    [XmlElement("CODE")]
    public string Code { get; set; }

    [XmlElement("DESCRIPTION")]
    public string Description { get; set; }
}
  

//

 <Genders><Genders list="1">
<Item>
<CODE>M</CODE>
<DESCRIPTION>Male</DESCRIPTION></Item>
 <Item>
 <CODE>F</CODE>
 <DESCRIPTION>Female</DESCRIPTION>
 </Item></Genders>
 </Genders>
  

Ответ №1:

Пожалуйста, проверьте мое решение, если оно вам поможет.

Ниже приведен метод, который преобразует xml в универсальный класс.

   public static T GetValue<T>(String value)
    {
        StringReader strReader = null;

        XmlSerializer serializer = null;

        XmlTextReader xmlReader = null;

        Object obj = null;
        try
        {
            strReader = new StringReader(value);

            serializer = new XmlSerializer(typeof(T));

            xmlReader = new XmlTextReader(strReader);

            obj = serializer.Deserialize(xmlReader);
        }
        catch (Exception exp)
        {

        }
        finally
        {
            if (xmlReader != null)
            {
                xmlReader.Close();
            }
            if (strReader != null)
            {
                strReader.Close();
            }
        }
        return (T)Convert.ChangeType(obj, typeof(T));
    }
  

Как вызвать этот метод :

Запрос objreq = новый запрос();

objreq = GetValue(strXmlData);

Запрос — это универсальный класс . strXmlData — это строка xml.

Запросить образец xml :

  <?xml version="1.0"?>
 <Req>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
  </Req>
  

Класс запроса :

 [System.SerializableAttribute()]
public partial class Req {

    [System.Xml.Serialization.XmlElementAttribute("book")]
    public catalogBook[] book { get; set; }

  }


[System.SerializableAttribute()]
public partial class catalogBook {

    public string author { get; set; }

    public string title { get; set; }

    public string genre { get; set; }

    public decimal price { get; set; }

    public System.DateTime publish_date { get; set; }

    public string description { get; set; }

    public string id { get; set; }

 }
  

В моем случае это работает отлично, надеюсь, что это сработает в вашем примере.

Спасибо.

Комментарии:

1. могу ли я также получить копию класса Req, который поможет мне понять, как использовать атрибуты xml большое спасибо,

2. Привет, пожалуйста, найдите образец xml. Вы можете создать соответствующий класс для вашего запроса xml.

Ответ №2:

Если вы хотите сериализовать и десериализовать объект с помощью xml, это самый простой способ:

Класс, который мы хотим сериализовать и десериализовать:

 [Serializable]
public class Person()
{
   public int Id {get;set;}
   public string Name {get;set;}
   public DateTime Birth {get;set;}
}
  

Сохраните объект в xml:

 public static void SaveObjectToXml<T>(T obj, string file) where T : class, new()
{
   if (string.IsNullOrWhiteSpace(file))
      throw new ArgumentNullException("File is empty");

   var serializer = new XmlSerializer(typeof(T));
   using (Stream fileStream = new FileStream(file, FileMode.Create))
   {
      using (XmlWriter xmlWriter = new XmlTextWriter(file, Encoding.UTF8))
      {
        serializer.Serialize(xmlWriter, obj);
      }
   }
}
  

Загрузить объект из xml:

 public static T LoadObjectFromXml<T>(string file) where T : class, new()
{
    if (string.IsNullOrWhiteSpace(file))
      throw new ArgumentNullException("File is empty");

    if (File.Exists(file))
    {
      XmlSerializer deserializer = new XmlSerializer(typeof(T));
      using (TextReader reader = new StreamReader(file))
      {
         obj = deserializer.Deserialize(reader) as T;
      }
    }
}
  

Как использовать эти методы с нашим классом Person:

 Person testPerson = new Person {Id = 1, Name="TestPerson", Birth = DateTime.Now};

SaveObjectToXml(testPerson, string "C:\MyFolder");

//Do some other stuff

//Oh now we need to load the object
var myPerson = LoadObjectFromXml<Person>("C:\MyFolder");

Console.WriteLine(myPerson.Name); //TestPerson
  

Методы сохранения и загрузки работают с каждым объектом, класс которого [Serializable] и который содержит общедоступный пустой конструктор.

Комментарии:

1. итак, с текущей реализацией и конструктором класса мне не нужны атрибуты xml?

2. В окончательной версии класса Gender все, что мне нужно для кода и описания, оставшийся атрибут в моем текущем классе Gender — это соответствие предстоящему формату XML

3. @toxic вам просто нужно [сериализуемое], ничего больше. С моей второй реализацией. Если вам нужны специальные форматы xml, вы должны пойти удобным путем, но если вы просто хотите сохранить свой объект и получить его обратно, вам не нужны эти xml-атрибуты.

4. да, все, что мне нужно, это объекты, и мне не нужен xml-атрибут! у вас есть какой-нибудь пример этого.?

5. @toxic дайте мне несколько минут, я обновлю свой ответ. Это почти то, что я написал…