C# 实体集合和实体转换成相应的string、XDocument、XElement、XDocument
https://msdn.microsoft.com/zh-cn/library/system.xml.linq.xelement(v=vs.110).aspx
XElement.Parse 方法 (String, LoadOptions)
负载 XElement 从包含 XML 字符串,可以选择保留空白和保留行信息。
命名空间: System.Xml.Linq
程序集: System.Xml.Linq(位于 System.Xml.Linq.dll)
参数
- text
- Type: System.String
一个 String 包含 XML。
- options
- Type: System.Xml.Linq.LoadOptions
一个 LoadOptions ,它指定空白行为以及是否加载基 URI 和行信息。
如果源 XML 有缩进,则将设置 PreserveWhitespace 中标记出来 options 导致读取器读取的源 XML 中的所有空白区域。 类型的节点 XText 创建同时有效空白和多余空白。
源 XML 有缩进,则不设置 PreserveWhitespace 中标记出来 options 导致读取器会忽略所有源 XML 中无关紧要的空白区域。 不包括无关紧要的空白区域任何文本节点创建 XML 树。
如果没有源 XML 缩进,则将设置 PreserveWhitespace 中标记出来 options 不起作用。 仍保留有效空白,并且不有可能导致多个空白文本节点创建的无关紧要的空白区域的任何范围。
有关详细信息,请参阅 加载或分析 XML 时保留空白 和 序列化时保留空白。
设置 SetBaseUri 不起作用时从其进行分析 String。
XmlReader 可能有也可能没有有效的行信息。 如果您设置 SetLineInfo, ,将报告的行信息从 XML 树中设置行信息 XmlReader。
如果您设置,则对性能产生负面影响 SetLineInfo 标志。
在加载 XML 文档之后立即行信息是准确的。 如果在加载文档之后修改 XML 树,行信息可能会变得毫无意义。
LINQ to XML 的加载功能基于 XmlReader。 因此,您可能会捕获所引发的任何异常 XmlReader.Create 重载的方法和 XmlReader 方法来读取和分析该文档。
下面的示例将字符串分析成 XElement 两种不同方式︰ 保留空白区域和不保留空白区域。 然后使用查询来确定生成的 XML 树中的空白节点数。
int whiteSpaceNodes;
XElement xmlTree1 = XElement.Parse("<Root> <Child> </Child> </Root>",
LoadOptions.None);
whiteSpaceNodes = xmlTree1
.DescendantNodesAndSelf()
.OfType<XText>()
.Where(tNode => tNode.ToString().Trim().Length == 0)
.Count();
Console.WriteLine("Count of white space nodes (not preserving whitespace): {0}",
whiteSpaceNodes);
XElement xmlTree2 = XElement.Parse("<Root> <Child> </Child> </Root>",
LoadOptions.PreserveWhitespace);
whiteSpaceNodes = xmlTree2
.DescendantNodesAndSelf()
.OfType<XText>()
.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): 0
Count of white space nodes (preserving whitespace): 3
下面的示例保留行信息,因为它会分析该字符串。
string markup =
@"<Root>
<Child>
<GrandChild/>
</Child>
</Root>"; 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
实体集合和实体转换成相应的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进行匹配,本文所有的代码如下:
复制代码
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;
}
}
复制代码
C# 实体集合和实体转换成相应的string、XDocument、XElement、XDocument的更多相关文章
- C#中实体集合和实体转换成相应的string、XDocument、XElement
C#中实体集合和实体转换成相应的string.XDocument.XElement public class SimpleXmlConverter { public static string ToX ...
- 将泛类型集合List类转换成DataTable
/// <summary> /// 将泛类型集合List类转换成DataTable /// </summary> /// <param name="list&q ...
- java中Object转换成int或String类型方法
转载: http://www.cnblogs.com/1020182600HENG/p/6137206.html Object obj = getObject(); if(obj instanceof ...
- Long型转换成IP段String、StringIP段转换成Long型
/** 把long类型的Ip转为一般Ip类型:xx.xx.xx.xx * * @param ip * @return */ public static String getIpFromLong(Lon ...
- C# 实现实体类和Xml转换
一.实体类转换成XML 将实体类转换成XML需要使用XmlSerializer类的Serialize方法,将实体类序列化 public static string XmlSerialize<T& ...
- 关于Web项目里的给表单验证控件添加结束时间不得小于开始时间的验证方法,日期转换和前台显示格式之间,还有JSON取日期数据格式转换成标准日期格式的问题
项目里有些不同页面间的日期显示格式是不同的, 第一个问题: 比如我用日期控件WdatePicker.js导包后只需在input标签里加上onClick="WdatePicker()" ...
- 带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel
步骤: 一.前台JS取HtmlTable数据,根据设定的分隔符把数据拼接起来 <!--导出Excel--> <script type="text/javascript&qu ...
- Java对象转换成xml对象和Java对象转换成JSON对象
1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...
- 用于把List<Object>转换成Map<String,Object>形式
/** * 用于把List<Object>转换成Map<String,Object>形式,便于存入缓存 * @author zhang_bo * @param keyName ...
随机推荐
- ACM -- 算法小结(六)逆波兰表达式
逆波兰表达式 //问题描述:逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2+3的 //逆波兰表达式法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必 //用括号改 ...
- java开发_数字转换汉语中人民币的大写_完整版
做这个应用,源于突然的一个想法:看到发票上面的数字要转换成汉语中人民币的大写 于是就有了下面的这些事儿..... 先看看运行效果: ================================== ...
- Google Code Jam 2010 Round 1C Problem A. Rope Intranet
Google Code Jam 2010 Round 1C Problem A. Rope Intranet https://code.google.com/codejam/contest/61910 ...
- svn 服务器搭建及使用 三
SVN服务器搭建和使用(三) 接下来,试试用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突等. 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文 ...
- es6 箭头函数 this 问题
1. 在箭头函数出现之前,每个新定义的函数都有其自己的this值(例如,构造函数的 this 指向了一个新的对象:严格模式下的函数的 this 值为 undefined:如果函数是作为对象的方法被调用 ...
- IOS发送Email的两种方法
IOS系统框架提供的两种发送Email的方法:openURL 和 MFMailComposeViewController.借助这两个方法,我们可以轻松的在应用里加入如用户反馈这类需要发送邮件的功能. ...
- HDU 4699 Editor (2013多校10,1004题)
Editor Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...
- /etc/fstab 转
一./etc/fstab文件的作用 磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,否则下次开机启动时仍然需要重新挂载. 系统开机时会主动读取/etc/fstab这个文件中的内容 ...
- infor系统日常问题解决笔记
1.问题:结算单核准时候显示订单XXX的状态为已修改. 解决方法:在采购订单状态栏重新核准订单,采购订单状态不影响发票核准,结算后不允许再新增采购订单行,否则仍然会提示采购订单状态为已修改,且无法进行 ...
- monkey源代码分析之事件注入方法变化
在上一篇文章<Monkey源代码分析之事件注入>中.我们看到了monkey在注入事件的时候用到了<Monkey源代码分析番外篇之Android注入事件的三种方法比較>中的第一种 ...