https://msdn.microsoft.com/zh-cn/library/system.xml.linq.xelement(v=vs.110).aspx
XElement.Parse 方法 (String, LoadOptions)
负载 从包含 XML 字符串,可以选择保留空白和保留行信息。
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 树中的空白节点数。
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
下面的示例保留行信息,因为它会分析该字符串。
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,代码如下:
针对于实体集合的转换,转换后的结果如下:
2.2 实体转换Xml
实体转换Xml的方法为:public static string ToXml<T>(T entity) where T : new(),通过传入的实体,可以转换成相应的Xml,代码如下:
针对于单个实体的转换,转换后的结果如下:
2.3 实体集合转换XElement
实体转换XElement的方法为:public static XElement ToXElement<T>(IList<T> entities, string rootName = "") where T : new(),通过传入的实体集合对象和Xml根名称,可以转换成相应的XElement,代码如下:
2.4 实体集合转换XmlDocument
实体转换XmlDocument的方法为:public static XElement ToXmlDocument<T>(IList<T> entities, string rootName = "") where T : new(),通过传入的实体集合对象和Xml根名称,可以转换成相应的XmlDocument,代码如下:
2.5 实体转换XElement
实体转换XElement的方法为:public static string ToXElement<T>(T entity) where T : new(),通过传入的实体,可以转换成相应的XElement,代码如下:
2.6 实体集合转换XDocument
实体转换XDocument的方法为:public static XDocument ToXDocument<T>(IList<T> entities, string rootName = "") where T : new(),通过传入的实体集合对象和Xml根名称,可以转换成相应的XDocument,代码如下:
三、总结
以上的代码很少,主要通过重构来使代码简化。当然,将实体集合和实体转换为相应的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;
} }复制代码