这里讲解一下linq对xml的基本操作,包括:
- 新建xml、新建节点
- 查询节点
- 插入属性、插入节点
- 替换节点
在这里我封装了一些常用的方法:
public class XmlHelper { /// <summary> /// xml路径名 /// </summary> public string XmlPath { get; set; } /// <summary> /// 初始化XmlPath /// </summary> /// <param name="xmlPath"></param> public XmlHelper(string xmlPath) { XmlPath = string.IsNullOrEmpty(xmlPath) ? "./my.xml" : xmlPath; } /// <summary> /// 初始化XML文件,如果原来有内容会被重置 /// </summary> /// <param name="root">root名</param> public void InitXml(string root = null) { if (!File.Exists(XmlPath)) { File.Create(XmlPath).Close(); } if (root == null) { root = @"root"; } XDocument xdoc = new XDocument( new XDeclaration("1.0", "utf-8", "yes"), new XElement(root, null) ); xdoc.Save(XmlPath); } /// <summary> /// 创建Element /// </summary> /// <param name="elementName">ElementName</param> /// <param name="elementValue">ElementValue</param> /// <param name="xAttributes">属性数组(可选)</param> /// <returns></returns> public XElement CreateElement(string elementName, string elementValue, params XAttribute[] xAttributes) { XElement xElement = new XElement(elementName, elementValue); if (xAttributes != null) { foreach (XAttribute xAttribute in xAttributes) { xElement.SetAttributeValue(xAttribute.Name, xAttribute.Value); } } return xElement; } /// <summary> /// 查询第一个指定itemName的节点 /// </summary> /// <param name="itemName"></param> /// <returns></returns> public XElement QueryFirstElementByName(string itemName) { XElement xele = XElement.Load(XmlPath); if (xele.Name == itemName) { return xele; } else { XElement xele1 = xele.Element("item"); return xele1; } } /// <summary> /// 查询查询第一个指定itemName、itemValue的节点 /// </summary> /// <param name="itemName"></param> /// <param name="itemValue"></param> /// <returns></returns> public XElement QueryElementByNameAndValue(string itemName, string itemValue) { XElement xele = XElement.Load(XmlPath); var item = (from ele in xele.Elements(itemName) where ele.Value.Equals(itemValue) select ele).FirstOrDefault(); return item; } /// <summary> /// 查询节点,通过itemName 和属性 /// </summary> /// <param name="itemName"></param> /// <param name="strAttributeName"></param> /// <param name="strAttributeValue"></param> /// <returns></returns> public XElement QueryElementByNameAndAttri(string itemName, string strAttributeName, string strAttributeValue) { XElement xele = XElement.Load(XmlPath); var item = (from ele in xele.Elements(itemName) where ele.Attribute(strAttributeName).Value == strAttributeValue select ele).FirstOrDefault(); return item; } /// <summary> /// 在指定节点后添加节点 /// </summary> /// <param name="itemName"></param> /// <param name="itemValue"></param> /// <param name="xElement"></param> public void AddToElementAfter(string itemName, string itemValue, XElement xElement) { XElement xele = XElement.Load(XmlPath); var item = (from ele in xele.Elements(itemName) where ele.Value.Equals(itemValue) select ele).SingleOrDefault(); if (item != null) { item.AddAfterSelf(xElement); } xele.Save(XmlPath); } /// <summary> /// 在指定节点前添加节点 /// </summary> /// <param name="itemName"></param> /// <param name="itemValue"></param> /// <param name="xElement"></param> public void AddToElementBefore(string itemName, string itemValue, XElement xElement) { XElement xele = XElement.Load(XmlPath); var item = (from ele in xele.Elements(itemName) where ele.Value.Equals(itemValue) select ele).SingleOrDefault(); if (item != null) { item.AddBeforeSelf(xElement); } xele.Save(XmlPath); } /// <summary> /// 在指定节点名下添加节点 /// </summary> /// <param name="itemName"></param> /// <param name="xElement"></param> public void AddElement(string itemName, XElement xElement) { XElement xele = XElement.Load(XmlPath); if (itemName == xele.Name) { xele.Add(xElement); } else { XElement item = xele.Element(itemName); if (item != null) { item.Add(xElement); } } //var item = (from ele in xele.Elements(itemName) // where ele.Value.Equals(null) // select ele).SingleOrDefault(); xele.Save(XmlPath); } /// <summary> /// 在指定节点下添加节点 /// </summary> /// <param name="rootElement"></param> /// <param name="xElement"></param> public void AddElement(XElement rootElement, XElement xElement) { XElement xele = XElement.Load(XmlPath); if (xele.Name == rootElement.Name) { xele.Add(xElement); } else { var root = xele.Element(rootElement.Name.LocalName); if (root != null) { root.Add(xElement); } } xele.Save(XmlPath); } /// <summary> /// 为指定节点添加属性 /// </summary> /// <param name="itemName"></param> /// <param name="itemValue"></param> /// <param name="attributeName"></param> /// <param name="attributeValue"></param> public void AddAttributeToEle(string itemName, string itemValue, string attributeName, string attributeValue) { XElement xele = XElement.Load(XmlPath); var item = (from ele in xele.Elements(itemName) where ele.Value.Equals(itemValue) select ele).SingleOrDefault(); if (item != null) { item.SetAttributeValue(attributeName, attributeValue); } xele.Save(XmlPath); } /// <summary> /// 在指定节点后添加注释 /// </summary> /// <param name="itemName"></param> /// <param name="itemValue"></param> /// <param name="xcomment"></param> public void AddCommentToAfter(string itemName, string itemValue, string xcomment) { XElement xele = XElement.Load(XmlPath); var item = (from ele in xele.Elements(itemName) where ele.Value.Equals(itemValue) select ele).SingleOrDefault(); if (item != null) { XComment xcom = new XComment(xcomment); item.AddAfterSelf(xcom); xele.Save(XmlPath); } } /// <summary> /// 在指定节点前添加注释 /// </summary> /// <param name="itemName"></param> /// <param name="itemValue"></param> /// <param name="xcomment"></param> public void AddCommentToBefore(string itemName, string itemValue, string xcomment) { XElement xele = XElement.Load(XmlPath); var item = (from ele in xele.Elements(itemName) where ele.Value.Equals(itemValue) select ele).SingleOrDefault(); if (item != null) { XComment xcom = new XComment(xcomment); item.AddBeforeSelf(xcom); xele.Save(XmlPath); } } /// <summary> /// 替换指定节点 /// </summary> /// <param name="itemName"></param> /// <param name="itemValue"></param> /// <param name="xElement"></param> public void ReplaceElement(string itemName, string itemValue, XElement xElement) { XElement xele = XElement.Load(XmlPath); var item = (from ele in xele.Elements(itemName) where ele.Value.Equals(itemValue) select ele).FirstOrDefault(); if (item != null) { item.ReplaceWith(xElement); } xele.Save(XmlPath); } /// <summary> /// 移除指定属性 /// </summary> /// <param name="itemName"></param> /// <param name="itemValue"></param> /// <param name="strAttribute"></param> public void RemoveAttribute(string itemName, string itemValue, string strAttribute) { XElement xele = XElement.Load(XmlPath); var item = (from ele in xele.Elements(itemName) where ele.Value.Equals(itemValue) select ele).FirstOrDefault().Attribute(strAttribute); if (item != null) { item.Remove(); } xele.Save(XmlPath); } /// <summary> /// 移除指定节点 /// </summary> /// <param name="itemName"></param> /// <param name="itemValue"></param> public void RemoveElement(string itemName, string itemValue) { XElement xele = XElement.Load(XmlPath); var item = (from ele in xele.Elements(itemName) where ele.Value.Equals(itemValue) select ele).FirstOrDefault(); if (item != null) { item.Remove(); } xele.Save(XmlPath); } }
经过验证,速度还是挺快的,但是如果要短时间操作大量数据的话,就应该自己封装一下自己需要的功能来加快速度,或者使用其他方法。