博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 实体集合和实体转换成相应的string、XDocument、XElement、XDocument
阅读量:6425 次
发布时间:2019-06-23

本文共 9333 字,大约阅读时间需要 31 分钟。

https://msdn.microsoft.com/zh-cn/library/system.xml.linq.xelement(v=vs.110).aspx

 

XElement.Parse 方法 (String, LoadOptions)

.NET Framework (current version)
 
其他版本
 
 

负载  从包含 XML 字符串,可以选择保留空白和保留行信息。

命名空间:   
程序集:  System.Xml.Linq(位于 System.Xml.Linq.dll)
 
 
C#
 
public static XElement Parse(	string text,	LoadOptions options)

参数

text
Type: 

一个  包含 XML。

options
Type: 

一个  ,它指定空白行为以及是否加载基 URI 和行信息。

返回值

Type: 

 包含 XML 的字符串填充的。

 
 

如果源 XML 有缩进,则将设置  中标记出来 options 导致读取器读取的源 XML 中的所有空白区域。 类型的节点  创建同时有效空白和多余空白。

源 XML 有缩进,则不设置  中标记出来 options 导致读取器会忽略所有源 XML 中无关紧要的空白区域。 不包括无关紧要的空白区域任何文本节点创建 XML 树。

如果没有源 XML 缩进,则将设置  中标记出来 options 不起作用。 仍保留有效空白,并且不有可能导致多个空白文本节点创建的无关紧要的空白区域的任何范围。

有关详细信息,请参阅  和 。

设置  不起作用时从其进行分析 。

 可能有也可能没有有效的行信息。 如果您设置 , ,将报告的行信息从 XML 树中设置行信息 。

如果您设置,则对性能产生负面影响  标志。

在加载 XML 文档之后立即行信息是准确的。 如果在加载文档之后修改 XML 树,行信息可能会变得毫无意义。

LINQ to XML 的加载功能基于 。 因此,您可能会捕获所引发的任何异常  重载的方法和  方法来读取和分析该文档。

 
 

下面的示例将字符串分析成  两种不同方式︰ 保留空白区域和不保留空白区域。 然后使用查询来确定生成的 XML 树中的空白节点数。

C#
 
int whiteSpaceNodes;XElement xmlTree1 = XElement.Parse("
", LoadOptions.None);whiteSpaceNodes = xmlTree1 .DescendantNodesAndSelf() .OfType
() .Where(tNode => tNode.ToString().Trim().Length == 0) .Count();Console.WriteLine("Count of white space nodes (not preserving whitespace): {0}", whiteSpaceNodes);XElement xmlTree2 = XElement.Parse("
", LoadOptions.PreserveWhitespace);whiteSpaceNodes = xmlTree2 .DescendantNodesAndSelf() .OfType
() .Where(tNode => tNode.ToString().Trim().Length == 0) .Count();Console.WriteLine("Count of white space nodes (preserving whitespace): {0}", whiteSpaceNodes);

该示例产生下面的输出:

 
 
Count of white space nodes (not preserving whitespace): 0Count of white space nodes (preserving whitespace): 3

下面的示例保留行信息,因为它会分析该字符串。

C#
 
string markup =@"
";XElement xRoot = XElement.Parse(markup, LoadOptions.SetLineInfo);Console.WriteLine("{0}{1}{2}", "Element Name".PadRight(20), "Line".PadRight(5), "Position");Console.WriteLine("{0}{1}{2}", "------------".PadRight(20), "----".PadRight(5), "--------");foreach (XElement e in xRoot.DescendantsAndSelf()) Console.WriteLine("{0}{1}{2}", ("".PadRight(e.Ancestors().Count() * 2) + e.Name).PadRight(20), ((IXmlLineInfo)e).LineNumber.ToString().PadRight(5), ((IXmlLineInfo)e).LinePosition);

该示例产生下面的输出:

 
 
Element Name        Line Position------------        ---- --------Root                1    2  Child             2    6    GrandChild      3    10

 

 
一、前言

上篇随笔主要是针对于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进行匹配,本文所有的代码如下:

复制代码
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;

}
}
复制代码

 
 
 
上一篇:
下一篇:
posted @ 
2012-02-19 09:46  阅读(4346) 评论(4)  

 

 

转载地址:http://eiyga.baihongyu.com/

你可能感兴趣的文章
Load Balance 产品横向比较
查看>>
Java代理程序实现web方式管理邮件组成员
查看>>
【编译打包】tengine 1.5.1 SRPM
查看>>
看图说话:手动清除病毒文件流程
查看>>
一句话下拖库
查看>>
Deploy Office Communications Server 2007R2 Group Chat Server(二)
查看>>
在Cacti上实现MSN报警机制
查看>>
如何对C++虚基类构造函数
查看>>
XFire WebService开发快速起步
查看>>
JavaScript 函数replace揭秘
查看>>
QTP解决内嵌IE窗体方法2
查看>>
“王子”的演讲:N828印象
查看>>
判断JS字符串中是否包含某些字符
查看>>
Phalanger---PHP的.NET编译器
查看>>
Scanner----java控制台和文件读取的利器(java 5新增)
查看>>
如何安全设定和检测你的密码安全性?
查看>>
一例HP ADG数据恢复成功(8×73GB SCSI)
查看>>
虚拟化系列-Citrix XenServer 6.1 XenMotion与HA
查看>>
TFS创建团队项目(三)
查看>>
对发展的一点小感想
查看>>