Linq to XML同样是对原C#访问XML文件的方法的封装,简化了用xpath进行xml的查询以及增加,修改,删除xml元素的操作。
LINQ to XML 三个最重要类:XElement、XAttribute和XDocument。
首先我们先介绍这三个类的基本属性和方法,然后再实现LinqtoXML的 增删改查。
1.XDocument
构造函数 名称 说明 XElement(XElement) 从其他 XElement 对象初始化 XElement 类的新实例。 XElement(XName) 用指定的名称初始化 XElement 类的新实例。 XElement(XStreamingElement) 从 XStreamingElement 对象初始化 XElement 类的新实例。 XElement(XName,Object) 用指定的名称和内容初始化 XElement 类的新实例。 XElement(XName,Object[]) 用指定的名称和内容初始化 XElement 类的新实例。 属性 名称 说明 BaseUri 获取此 XObject 的基 URI。 (继承自 XObject。) Document 获取此 XObject 的 XDocument。 (继承自 XObject。) EmptySequence 获取空的元素集合。 FirstAttribute 获取此元素的第一个属性。 FirstNode 获取此节点的第一个子节点。 (继承自 XContainer。) HasAttributes 获取一个值,该值指示此元素是否至少具有一个属性。 HasElements 获取一个值,该值指示此元素是否至少具有一个子元素。 IsEmpty 获取一个值,该值指示此元素是否不包含内容。 LastAttribute 获取此元素的最后一个属性。 LastNode 获取此节点的最后一个子节点。 (继承自 XContainer。) Name 获取或设置此元素的名称。 NextNode 获取此节点的下一个同级节点。 (继承自 XNode。) NodeType 获取此节点的节点类型。 (重写 XObject.NodeType。) Parent 获取此 XObject 的父级 XElement。 (继承自 XObject。) PrevIoUsNode 获取此节点的上一个同级节点。 (继承自 XNode。) Value 获取或设置此元素的串连文本内容。 方法 名称 说明 Add(Object) 将指定的内容添加为此 XContainer 的子级。 (继承自 XContainer。) Add(Object[]) 将指定的内容添加为此 XContainer 的子级。 (继承自 XContainer。) AddAfterSelf(Object) 紧跟在此节点之后添加指定的内容。 (继承自 XNode。) AddAfterSelf(Object[]) 紧跟在此节点之后添加指定的内容。 (继承自 XNode。) AddAnnotation 将对象添加到此 XObject 的批注列表。 (继承自 XObject。) AddBeforeSelf(Object) 紧邻此节点之前添加指定的内容。 (继承自 XNode。) AddBeforeSelf(Object[]) 紧邻此节点之前添加指定的内容。 (继承自 XNode。) AddFirst(Object) 将指定的内容作为此文档或元素的第一个子级添加。 (继承自 XContainer。) AddFirst(Object[]) 将指定的内容作为此文档或元素的第一个子级添加。 (继承自 XContainer。) Ancestors() 返回此节点的上级元素的集合。 (继承自 XNode。) Ancestors(XName) 返回此节点的经过筛选的上级元素的集合。 集合中只包括具有匹配 XName 的元素。 (继承自 XNode。) AncestorsAndSelf() 返回元素集合,其中包含此元素及其上级。 AncestorsAndSelf(XName) 返回经过筛选的元素集合,其中包含此元素及其上级。 集合中只包括具有匹配 XName 的元素。 Annotation(Type) 从此 XObject 获取指定类型的第一个批注对象。 (继承自 XObject。) Annotation<T>() 从此 XObject 获取指定类型的第一个批注对象。 (继承自 XObject。) Annotations(Type) 获取此 XObject 的指定类型的批注集合。 (继承自 XObject。) Annotations<T>() 获取此 XObject 的指定类型的批注集合。 (继承自 XObject。) Attribute 返回具有指定 XName 的此 XElement 的 XAttribute。 Attributes() 返回此元素的属性集合。 Attributes(XName) 返回经过筛选的此元素的属性集合。 集合中只包括具有匹配 XName 的元素。 CreateReader() 创建此节点的 XmlReader。 (继承自 XNode。) CreateReader(ReaderOptions) 使用 readerOptions 参数指定的选项创建 XmlReader。 (继承自 XNode。) CreateWriter 创建可用于将节点添加至 XContainer 的 XmlWriter。 (继承自 XContainer。) DescendantNodes 按文档顺序返回此文档或元素的子代节点集合。 (继承自 XContainer。) DescendantNodesAndSelf 返回节点的集合,而这些节点包含此元素以及此元素的所有子代节点,并将它们按文档顺序排列。 Descendants() 按文档顺序返回此文档或元素的子代元素集合。 (继承自 XContainer。) Descendants(XName) 按文档顺序返回此文档或元素的经过筛选的子代元素集合。 集合中只包括具有匹配 XName 的元素。 (继承自 XContainer。) DescendantsAndSelf() 返回元素的集合,而这些元素包含此元素以及此元素的所有子代元素,并按文档顺序排列它们。 DescendantsAndSelf(XName) 返回经过筛选的元素集合,这些元素包含此元素以及此元素的所有子代元素,并按文档顺序排列它们。 集合中只包括具有匹配 XName 的元素。 Element 获取具有指定 XName 的第一个(按文档顺序)子元素。 (继承自 XContainer。) Elements() 按文档顺序返回此元素或文档的子元素集合。 (继承自 XContainer。) Elements(XName) 按文档顺序返回此元素或文档的经过筛选的子元素集合。 集合中只包括具有匹配 XName 的元素。(继承自 XContainer。) ElementsAfterSelf() 按文档顺序返回此节点后的同级元素集合。 (继承自 XNode。) ElementsAfterSelf(XName) 按文档顺序返回此节点后经过筛选的同级元素的集合。 集合中只包括具有匹配 XName 的元素。(继承自 XNode。) ElementsBeforeSelf() 按文档顺序返回此节点前的同级元素集合。 (继承自 XNode。) ElementsBeforeSelf(XName) 按文档顺序返回此节点前经过筛选的同级元素的集合。 集合中只包括具有匹配 XName 的元素。(继承自 XNode。) GetDefaultNamespace 获取此 XElement 的默认 XNamespace。 GetNamespaceOfPrefix 获取此 XElement 的与特定前缀关联的命名空间。 GetPrefixOfNamespace 获取与此 XElement 的命名空间关联的前缀。 IsAfter 确定当前节点是否按文档顺序显示在指定节点之后。 (继承自 XNode。) IsBefore 确定当前节点是否按文档顺序显示在指定节点之前。 (继承自 XNode。) Load(Stream) 使用指定的流创建一个新的 XElement 实例。 Load(String) 从文件加载 XElement。 Load(TextReader) 从 TextReader 加载 XElement。 Load(XmlReader) 从 XmlReader 加载 XElement。 Load(Stream,LoadOptions) 使用指定流创建新的 XElement 实例,也可以选择保留空白,设置基 URI 和保留行信息。 Load(String,LoadOptions) 从文件加载 XElement,还可以选择保留空白、设置基 URI 和保留行信息。 Load(TextReader,LoadOptions) 从 TextReader 加载 XElement,还可以选择保留空白和行信息。 Load(XmlReader,LoadOptions) 从 XmlReader 加载 XElement 时,可以选择保留空白、设置基 URI 和保留行信息。 Nodes 按文档顺序返回此元素或文档的子节点集合。 (继承自 XContainer。) NodesAfterSelf 按文档顺序返回此节点后的同级节点的集合。 (继承自 XNode。) NodesBeforeSelf 按文档顺序返回此节点前的同级节点的集合。 (继承自 XNode。) Parse(String) 从包含 XML 的字符串加载 XElement。 Parse(String,LoadOptions) 从包含 XML 的字符串加载 XElement,还可以选择保留空白和行信息。 Remove 从节点父级中删除此节点。 (继承自 XNode。) RemoveAll 从此 XElement 中移除节点和属性。 RemoveAnnotations(Type) 从此 XObject 移除指定类型的批注。 (继承自 XObject。) RemoveAnnotations<T>() 从此 XObject 移除指定类型的批注。 (继承自 XObject。) RemoveAttributes 移除此 XElement 的属性。 RemoveNodes 从此文档或元素中移除子节点。 (继承自 XContainer。) ReplaceAll(Object) 使用指定的内容替换此元素的子节点和属性。 ReplaceAll(Object[]) 使用指定的内容替换此元素的子节点和属性。 ReplaceAttributes(Object) 使用指定的内容替换此元素的属性。 ReplaceAttributes(Object[]) 使用指定的内容替换此元素的属性。 ReplaceNodes(Object) 使用指定的内容替换此文档或元素的子节点。 (继承自 XContainer。) ReplaceNodes(Object[]) 使用指定的内容替换此文档或元素的子节点。 (继承自 XContainer。) ReplaceWith(Object) 使用指定的内容替换此节点。 (继承自 XNode。) ReplaceWith(Object[]) 使用指定的内容替换此节点。 (继承自 XNode。) Save(Stream) 将此 XElement 输出到指定的 Stream。 Save(String) 将此元素序列化为文件。 Save(TextWriter) 将此元素序列化为 TextWriter。 Save(XmlWriter) 将此元素序列化为 XmlWriter。 Save(Stream,SaveOptions) 将此 XElement 输出到指定的 Stream,(可选)并指定格式设置行为。 Save(String,SaveOptions) 将此元素序列化为文件,并可以选择禁用格式设置。 Save(TextWriter,SaveOptions) 将此元素序列化为 TextWriter,并可以选择禁用格式设置。 SetAttributeValue 设置属性的值、添加属性或移除属性。 SetElementValue 设置子元素的值、添加子元素或移除子元素。 SetValue 设置此元素的值。 ToString() 返回此节点的缩进 XML。 (继承自 XNode。) ToString(SaveOptions) 返回此节点的 XML,还可以选择禁用格式设置。 (继承自 XNode。) WriteTo 将此元素写入 XmlWriter。 (重写 XNode.WriteTo(XmlWriter)。)
2.XElement
构造函数 名称 说明 XDocument() 初始化 XDocument 类的新实例。 XDocument(Object[]) 使用指定的内容初始化 XDocument 类的新实例。 XDocument(XDocument) 从现有的 XDocument 对象初始化 XDocument 类的新实例。 XDocument(XDeclaration,Object[]) 用指定的 XDeclaration 和内容初始化 XDocument 类的新实例。 属性 名称 说明 BaseUri 获取此 XObject 的基 URI。 (继承自 XObject。) Declaration 获取或设置此文档的 XML 声明。 Document 获取此 XObject 的 XDocument。 (继承自 XObject。) DocumentType 获取此文档的文档类型定义 (DTD)。 FirstNode 获取此节点的第一个子节点。 (继承自 XContainer。) LastNode 获取此节点的最后一个子节点。 (继承自 XContainer。) NextNode 获取此节点的下一个同级节点。 (继承自 XNode。) NodeType 获取此节点的节点类型。 (重写 XObject.NodeType。) Parent 获取此 XObject 的父级 XElement。 (继承自 XObject。) PrevIoUsNode 获取此节点的上一个同级节点。 (继承自 XNode。) Root 获取此文档的 XML 树的根元素。 方法 名称 说明 Add(Object) 将指定的内容添加为此 XContainer 的子级。 (继承自 XContainer。) Add(Object[]) 将指定的内容添加为此 XContainer 的子级。 (继承自 XContainer。) AddAfterSelf(Object) 紧跟在此节点之后添加指定的内容。 (继承自 XNode。) AddAfterSelf(Object[]) 紧跟在此节点之后添加指定的内容。 (继承自 XNode。) AddAnnotation 将对象添加到此 XObject 的批注列表。 (继承自 XObject。) AddBeforeSelf(Object) 紧邻此节点之前添加指定的内容。 (继承自 XNode。) AddBeforeSelf(Object[]) 紧邻此节点之前添加指定的内容。 (继承自 XNode。) AddFirst(Object) 将指定的内容作为此文档或元素的第一个子级添加。 (继承自 XContainer。) AddFirst(Object[]) 将指定的内容作为此文档或元素的第一个子级添加。 (继承自 XContainer。) Ancestors() 返回此节点的上级元素的集合。 (继承自 XNode。) Ancestors(XName) 返回此节点的经过筛选的上级元素的集合。 集合中只包括具有匹配 XName 的元素。 (继承自 XNode。) Annotation(Type) 从此 XObject 获取指定类型的第一个批注对象。 (继承自 XObject。) Annotation<T>() 从此 XObject 获取指定类型的第一个批注对象。 (继承自 XObject。) Annotations(Type) 获取此 XObject 的指定类型的批注集合。 (继承自 XObject。) Annotations<T>() 获取此 XObject 的指定类型的批注集合。 (继承自 XObject。) CreateReader() 创建此节点的 XmlReader。 (继承自 XNode。) CreateReader(ReaderOptions) 使用 readerOptions 参数指定的选项创建 XmlReader。 (继承自 XNode。) CreateWriter 创建可用于将节点添加至 XContainer 的 XmlWriter。 (继承自 XContainer。) DescendantNodes 按文档顺序返回此文档或元素的子代节点集合。 (继承自 XContainer。) Descendants() 按文档顺序返回此文档或元素的子代元素集合。 (继承自 XContainer。) Descendants(XName) 按文档顺序返回此文档或元素的经过筛选的子代元素集合。 集合中只包括具有匹配 XName 的元素。 (继承自 XContainer。) Element 获取具有指定 XName 的第一个(按文档顺序)子元素。 (继承自 XContainer。) Elements() 按文档顺序返回此元素或文档的子元素集合。 (继承自 XContainer。) Elements(XName) 按文档顺序返回此元素或文档的经过筛选的子元素集合。 集合中只包括具有匹配 XName 的元素。 (继承自 XContainer。) ElementsAfterSelf() 按文档顺序返回此节点后的同级元素集合。 (继承自 XNode。) ElementsAfterSelf(XName) 按文档顺序返回此节点后经过筛选的同级元素的集合。 集合中只包括具有匹配 XName 的元素。 (继承自 XNode。) ElementsBeforeSelf() 按文档顺序返回此节点前的同级元素集合。 (继承自 XNode。) ElementsBeforeSelf(XName) 按文档顺序返回此节点前经过筛选的同级元素的集合。 集合中只包括具有匹配 XName 的元素。 (继承自 XNode。) IsAfter 确定当前节点是否按文档顺序显示在指定节点之后。 (继承自 XNode。) IsBefore 确定当前节点是否按文档顺序显示在指定节点之前。 (继承自 XNode。) Load(Stream) 使用指定的流创建一个新的 XDocument 实例。 Load(String) 从文件创建新 XDocument。 Load(TextReader) 从 TextReader 创建新的 XDocument。 Load(XmlReader) 从 XmlReader 创建新 XDocument。 Load(Stream,LoadOptions) 使用指定流创建新的 XDocument 实例,也可以选择保留空白,设置基 URI 和保留行信息。 Load(String,LoadOptions) 从文件创建新 XDocument,还可以选择保留空白和行信息以及设置基 URI。 Load(TextReader,LoadOptions) 从 TextReader 创建新 XDocument,还可以选择保留空白和行信息以及设置基 URI。 Load(XmlReader,LoadOptions) 从 XmlReader 加载 XDocument,还可以选择设置基 URI 和保留行信息。 Nodes 按文档顺序返回此元素或文档的子节点集合。 (继承自 XContainer。) NodesAfterSelf 按文档顺序返回此节点后的同级节点的集合。 (继承自 XNode。) NodesBeforeSelf 按文档顺序返回此节点前的同级节点的集合。 (继承自 XNode。) Parse(String) 从字符串创建新 XDocument。 Parse(String,LoadOptions) 从字符串创建新 XDocument,还可以选择保留空白和行信息以及设置基 URI。 Remove 从节点父级中删除此节点。 (继承自 XNode。) RemoveAnnotations(Type) 从此 XObject 移除指定类型的批注。 (继承自 XObject。) RemoveAnnotations<T>() 从此 XObject 移除指定类型的批注。 (继承自 XObject。) RemoveNodes 从此文档或元素中移除子节点。 (继承自 XContainer。) ReplaceNodes(Object) 使用指定的内容替换此文档或元素的子节点。 (继承自 XContainer。) ReplaceNodes(Object[]) 使用指定的内容替换此文档或元素的子节点。 (继承自 XContainer。) ReplaceWith(Object) 使用指定的内容替换此节点。 (继承自 XNode。) ReplaceWith(Object[]) 使用指定的内容替换此节点。 (继承自 XNode。) Save(Stream) 将此 XDocument 输出到指定的 Stream。 Save(String) 序列化此 XDocument 到文件,如果该文件存在,则覆盖现有的文件。 Save(TextWriter) 将此 XDocument 序列化为 TextWriter。 Save(XmlWriter) 将此 XDocument 序列化为 XmlWriter。 Save(Stream,SaveOptions) 将此 XDocument 输出到指定的 Stream,(可选)并指定格式设置行为。 Save(String,SaveOptions) 将此 XDocument 序列化为文件,还可以选择禁用格式设置。 Save(TextWriter,SaveOptions) 将此 XDocument 序列化为 TextWriter,还可以选择禁用格式设置。 ToString() 返回此节点的缩进 XML。 (继承自 XNode。) ToString(SaveOptions) 返回此节点的 XML,还可以选择禁用格式设置。 (继承自 XNode。) WriteTo 将此文档写入 XmlWriter。 (重写 XNode.WriteTo(XmlWriter)。)
3.XAttribute
构造函数 名称 说明 XAttribute(XAttribute) 从其他 XAttribute 对象初始化 XAttribute 类的新实例。 XAttribute(XName,Object) 从指定的名称和值初始化 XAttribute 类的新实例。 属性 名称 说明 BaseUri 获取此 XObject 的基 URI。 (继承自 XObject。) Document 获取此 XObject 的 XDocument。 (继承自 XObject。) EmptySequence 获取空的属性集合。 IsNamespaceDeclaration 确定此属性是否为命名空间声明。 Name 获取此属性 (Attribute) 的展开名称。 NextAttribute 获取父元素的下一个属性 (Attribute)。 NodeType 获取此节点的节点类型。 (重写 XObject.NodeType。) Parent 获取此 XObject 的父级 XElement。 (继承自 XObject。) PrevIoUsAttribute 获取父元素的上一个属性 (Attribute)。 Value 获取或设置此属性的值。 方法 名称 说明 AddAnnotation 将对象添加到此 XObject 的批注列表。 (继承自 XObject。) Annotation(Type) 从此 XObject 获取指定类型的第一个批注对象。 (继承自 XObject。) Annotation<T>() 从此 XObject 获取指定类型的第一个批注对象。 (继承自 XObject。) Annotations(Type) 获取此 XObject 的指定类型的批注集合。 (继承自 XObject。) Annotations<T>() 获取此 XObject 的指定类型的批注集合。 (继承自 XObject。) Remove 从此属性的父元素中移除它。 RemoveAnnotations(Type) 从此 XObject 移除指定类型的批注。 (继承自 XObject。) RemoveAnnotations<T>() 从此 XObject 移除指定类型的批注。 (继承自 XObject。) SetValue 设置此属性的值。 ToString 将当前的 XAttribute 对象转换为字符串表示形式。 (重写 Object.ToString()。)
简单示例
1.创建XML
XDocument doc = new XDocument( ///创建XDocument类的实例 new XDeclaration("1.0",utf-8yes"),0)">XML的声明,包括版本,编码,xml文件是否独立 new XElement(Books添加根节点 Book添加一个节点 new XAttribute(BookID001添加属性BookID BookNo0001添加元素BookNo BookNameBook 0001添加元素BookName BookPrice40添加元素BookPrice BookRemarkThis is a book 0001")添加元素BookRemark ) ) ); 保存XML文件到指定地址 doc.Save(@"C:\Books.xml");
2.添加元素
导入XML文件 XElement xe = XElement.Load("); 创建一个新节点 XElement book1 = ",002"),0)">0002Book 000250This is a book 0002") ); 添加节点到XML文件中,并保存 xe.Add(book1); 创建一个新节点 XElement book2 = 0030003Book 000330This is a book 0003添加节点到XML文件中,并保存 xe.Add(book2); 创建一个新节点 XElement book3 = 0040004Book 000460This is a book 0004添加节点到XML文件中 xe.Add(book3); 保存到XML文件中 xe.Save( 3.修改元素XElement xe = XElement.Load(查询修改的元素 IEnumerable<XElement> element = from e in xe.Elements(") where e.Attribute(").Value == xxx" //xxx指定的修改元素 select e; 修改元素 if (element.Count() > 0) { XElement firstelement = element.First(); 设置新的属性 firstelement.SetAttributeValue(new004"); 替换成新的节点 firstelement.ReplaceNodes( new0004Book new000445This is a book new0004") ); } xe.Save( 4.删除元素xxx 指定删除元素 删除此元素的所有节点和属性 firstelement.RemoveAll(); 删除此元素的属性 firstelement.RemoveAttributes(); 删除此元素的子节点 firstelement.RemoveNodes(); } xe.Save(");5.一些常用查询
"); 查询元素并排序 var elements = xe.Elements(") .Where(e => Convert.ToInt32(e.Attribute(").Value.Substring(e.Attribute(").Value.Length - 1,128)">1)) > 1) .OrderByDescending(e => (string)e.Element(")) .ToList(); 查询指定元素的子元素 ") .Descendants(") xxx 指定元素 .ToList(); 查询指定属性的元素 var eAttribute = xe.Elements(") .Where(e => (string)e.Attribute(") == xxx 指定属性 .OrderBy(e => e.Element(查询指定名称的元素 ") .Where(e => (指定元素名称 .OrderBy(e => e.Element(")) .ToList();
到这里结束了,现在感觉LINQtoXML是不是很简单啊,相信你会喜欢上Linq语法的。本文只着重介绍了LINQtoXML类的 XElement、XAttribute和XDocument三个类,当然还有其他的一些,这里就不作详细介绍了,如需查看请点此跳转到MSDNLINQtoXML类概述。