實體集合和實體轉換成相應的string、XDocument、XElement、XDocument


一、前言

上篇隨筆主要是針對於Xml的特性Attribute與實體之間的匹配與轉換。該篇隨筆主要內容為將對象轉換成相應的Xml以及XElement。這2篇隨筆以不同的方式對Xml進行轉換與匹配,每種匹配都采用不同的角度進行操作。本文主要為對象實體的轉換,下篇側重於Xml的匹配。

二、Xml轉換

2.1 實體集合轉換Xml

實體集合轉換Xml的方法為:public static string ToXml<T>(IList<T> entities, string rootName = "") where T : new(),通過傳入的實體集合對象和Xml根名稱,可以轉換成相應的Xml,代碼如下:

 1         public  static  string ToXml<T>(IList<T> entities,  string rootName =  ""where T :  new()
 2         {
 3              if (entities ==  null || entities.Count ==  0)
 4             {
 5                  return  string.Empty;
 6             }
 7 
 8             StringBuilder builder =  new StringBuilder();
 9             builder.AppendLine(XmlResource.XmlHeader);
10 
11             XElement element = ToXElement<T>(entities, rootName);
12             builder.Append(element.ToString());
13 
14              return builder.ToString();
15         }

 針對於實體集合的轉換,轉換后的結果如下:

 1 <?xml version= " 1.0" encoding="utf-8" ?>
 2  <MapperInfoSet>
 3   <MapperInfo>
 4     <Name>MapperInfoIndex0</Name>
 5     <CreatedTime> 2012- 02-19T08: 54: 44.9411601+ 08: 00</CreatedTime>
 6     <IsActive> true</IsActive>
 7     <Value> 0</Value>
 8     <Percent> 50</Percent>
 9     <TargetUrl>www.codeplex.com?Id= 0</TargetUrl>
10   </MapperInfo>
11   <MapperInfo>
12     <Name>MapperInfoIndex1</Name>
13     <CreatedTime> 2012- 02-19T08: 54: 44.9421602+ 08: 00</CreatedTime>
14     <IsActive> false</IsActive>
15     <Value> 1</Value>
16     <Percent> 50</Percent>
17     <TargetUrl>www.codeplex.com?Id= 1</TargetUrl>
18   </MapperInfo>
19 </MapperInfoSet>

 

2.2 實體轉換Xml

實體轉換Xml的方法為:public static string ToXml<T>(T entity) where T : new(),通過傳入的實體,可以轉換成相應的Xml,代碼如下:

 1          public  static  string ToXml<T>(T entity)  where T :  new()
 2         {
 3              if (entity ==  null)
 4             {
 5                  return  string.Empty;
 6             }
 7 
 8             XElement element = ToXElement<T>(entity);
 9 
10              return element.ToString();
11         }

針對於單個實體的轉換,轉換后的結果如下:

1 <MapperInfo>
2   <Name>MapperInfoIndex0</Name>
3   <CreatedTime> 2012- 02-19T08: 59: 17.1387289+ 08: 00</CreatedTime>
4   <IsActive> true</IsActive>
5   <Value> 0</Value>
6   <Percent> 50</Percent>
7   <TargetUrl>www.codeplex.com?Id= 0</TargetUrl>
8 </MapperInfo>

 

2.3 實體集合轉換XElement

實體轉換XElement的方法為:public static XElement ToXElement<T>(IList<T> entities, string rootName = "") where T : new(),通過傳入的實體集合對象和Xml根名稱,可以轉換成相應的XElement,代碼如下:

 1          public  static XElement ToXElement<T>(IList<T> entities,  string rootName =  ""where T :  new()
 2         {
 3              if (entities ==  null || entities.Count ==  0)
 4             {
 5                  return  null;
 6             }
 7 
 8              if ( string.IsNullOrWhiteSpace(rootName))
 9             {
10                 rootName =  typeof(T).Name + XmlResource.XmlRootNameSuffix;
11             }
12 
13             XElement element =  new XElement(rootName);
14 
15              foreach (T entity  in entities)
16             {
17                 element.Add(ToXElement<T>(entity));
18             }
19 
20              return element;
21         }

 

2.4 實體集合轉換XmlDocument

實體轉換XmlDocument的方法為:public static XElement ToXmlDocument<T>(IList<T> entities, string rootName = "") where T : new(),通過傳入的實體集合對象和Xml根名稱,可以轉換成相應的XmlDocument,代碼如下:

 1          public  static XmlDocument ToXmlDocument<T>(IList<T> entities,  string rootName =  ""where T :  new()
 2         {
 3              if (entities ==  null || entities.Count ==  0)
 4             {
 5                  return  null;
 6             }
 7 
 8             XmlDocument xmlDocument =  new XmlDocument();
 9             xmlDocument.LoadXml(ToXml<T>(entities, rootName));
10 
11              return xmlDocument;
12         }

 

2.5 實體轉換XElement

實體轉換XElement的方法為:public static string ToXElement<T>(T entity) where T : new(),通過傳入的實體,可以轉換成相應的XElement,代碼如下:

 1          public  static XElement ToXElement<T>(T entity)  where T :  new()
 2         {
 3              if (entity ==  null)
 4             {
 5                  return  null;
 6             }
 7 
 8             XElement element =  new XElement( typeof(T).Name);
 9             PropertyInfo[] properties =  typeof(T).GetProperties();
10             XElement innerElement =  null;
11              object propertyValue =  null;
12 
13              foreach (PropertyInfo property  in properties)
14             {
15                 propertyValue = property.GetValue(entity,  null);
16                 innerElement =  new XElement(property.Name, propertyValue);
17                 element.Add(innerElement);
18             }
19 
20              return element;
21         }

 

2.6 實體集合轉換XDocument

實體轉換XDocument的方法為:public static XDocument ToXDocument<T>(IList<T> entities, string rootName = "") where T : new(),通過傳入的實體集合對象和Xml根名稱,可以轉換成相應的XDocument,代碼如下:

1          public  static XDocument ToXDocument<T>(IList<T> entities,  string rootName =  ""where T :  new()
2         {
3              if (entities ==  null || entities.Count ==  0)
4             {
5                  return  null;
6             }
7           
8              return  XDocument.Parse(ToXml<T>(entities, rootName));
9         }

 

 三、總結

以上的代碼很少,主要通過重構來使代碼簡化。當然,將實體集合和實體轉換為相應的string、XDocument、XElement、XDocument是非常簡單的。單元測試的代碼就不貼了,占地方。下篇隨筆主要是如何將本文中轉換的Xml進行匹配,本文所有的代碼如下:

View Code
     public  class SimpleXmlConverter
    {
         public  static  string ToXml<T>(IList<T> entities,  string rootName =  ""where T :  new()
        {
             if (entities ==  null || entities.Count ==  0)
            {
                 return  string.Empty;
            }

            StringBuilder builder =  new StringBuilder();
            builder.AppendLine(XmlResource.XmlHeader);

            XElement element = ToXElement<T>(entities, rootName);
            builder.Append(element.ToString());

             return builder.ToString();
        }

         public  static XmlDocument ToXmlDocument<T>(IList<T> entities,  string rootName =  ""where T :  new()
        {
             if (entities ==  null || entities.Count ==  0)
            {
                 return  null;
            }

            XmlDocument xmlDocument =  new XmlDocument();
            xmlDocument.LoadXml(ToXml<T>(entities, rootName));

             return xmlDocument;
        }

         public  static XDocument ToXDocument<T>(IList<T> entities,  string rootName =  ""where T :  new()
        {
             if (entities ==  null || entities.Count ==  0)
            {
                 return  null;
            }
          
             return  XDocument.Parse(ToXml<T>(entities, rootName));
        }

         public  static XElement ToXElement<T>(IList<T> entities,  string rootName =  ""where T :  new()
        {
             if (entities ==  null || entities.Count ==  0)
            {
                 return  null;
            }
             
             if ( string.IsNullOrWhiteSpace(rootName))
            {
                rootName =  typeof(T).Name + XmlResource.XmlRootNameSuffix;
            }

            XElement element =  new XElement(rootName);

             foreach (T entity  in entities)
            {
                element.Add(ToXElement<T>(entity));
            }

             return element;
        }

         public  static  string ToXml<T>(T entity)  where T :  new()
        {
             if (entity ==  null)
            {
                 return  string.Empty;
            }

            XElement element = ToXElement<T>(entity);

             return element.ToString();
        }

         public  static XElement ToXElement<T>(T entity)  where T :  new()
        {
             if (entity ==  null)
            {
                 return  null;
            }

            XElement element =  new XElement( typeof(T).Name);
            PropertyInfo[] properties =  typeof(T).GetProperties();
            XElement innerElement =  null;
             object propertyValue =  null;

             foreach (PropertyInfo property  in properties)
            {
                propertyValue = property.GetValue(entity,  null);
                innerElement =  new XElement(property.Name, propertyValue);
                element.Add(innerElement);
            }

             return element;
        }

         public  static XElement ToXElement(Type type) 
        {
             if (type ==  null)
            {
                 return  null;
            }

            XElement element =  new XElement(type.Name);
            PropertyInfo[] properties = type.GetProperties();
            XElement innerElement =  null;

             foreach (PropertyInfo property  in properties)
            {
                innerElement =  new XElement(property.Name,  null);
                element.Add(innerElement);
            }

             return element;
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。