Linq to XML是Linq三种操作中的一种,有多种不同方法可实现Linq对xml文件的操作,比如:XmlDocument,DataSet,XDocument,XElement,XMLReader。
命名空间:
System.XML;
System.XML.Linq;
传统操作方式是:
1. XmlDocument:用xpath遍历xml树找到需要操作的节点,然后再进行相应的操作。
2. DataSet:将xml文件加载到一个dataset里面,然后再操作data table的方法进行相应操作。
传统方式的缺点是操作起来不够简便。
看一个例子:
<?xml version="1.0" encoding="utf-8"?>
<Permission>
<right name="Rb5" value="32" description="罚单管理" type="bs" />
<right name="Rb4" value="16" description="报表管理" type="bs" />
<right name="Rb0" value="1" description="车辆信息管理" type="bs" />
<right name="Rb1" value="2" description="车载终端管理" type="bs" />
<right name="Rb2" value="4" description="用户权限管理" type="bs" />
<right name="Rb3" value="8" description="角色管理" type="bs" />
<right name="Rc0" value="1" description="车辆信息管理" type="cs" />
<right name="Rc1" value="2" description="车载终端管理" type="cs" />
</Permission>
XmlDocument操作:
XmlDocument document = new XmlDocument();
document.Load(XmlFilePath);
//增、删、改、查的操作
#region Add,Update and Delete Methods
/// <summary>
/// Add new permission description
/// </summary>
/// <param name="name">the permission's name</param>
/// <param name="description">the permission's description</param>
public void AddNewPermission(string name,string description,string value,string type)
{
XmlElement element = null;
XmlAttribute attrName = null;
XmlAttribute attrValue = null;
XmlAttribute attrDes = null;
XmlAttribute attrType = null;
try
{
XmlElement root = document.DocumentElement;
element = document.CreateElement("right");
attrName = document.CreateAttribute("name");
attrValue = document.CreateAttribute("value");
attrDes = document.CreateAttribute("description");
attrType = document.CreateAttribute("type");
attrName.Value = name;
attrValue.Value = value;
attrDes.Value = description;
attrType.Value = type;
//element.InnerText = description;
element.SetAttributeNode(attrName);
element.SetAttributeNode(attrValue);
element.SetAttributeNode(attrDes);
element.SetAttributeNode(attrType);
root.InsertAfter(element,root.NextSibling);
document.Save(XmlFilePath);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// Remove the given permission
/// </summary>
/// <param name="rightName">the given permission's name</param>
public void RemoveGivenPermission(string rightName)
{
XmlNode node = null;
string strXpath = string.Empty;
try
{
strXpath = string.Format("/Permission/right[@name='{0}']",rightName);
node = document.DocumentElement.SelectSingleNode(strXpath);
if (node != null)
{
document.DocumentElement.RemoveChild(node);
document.Save(XmlFilePath);
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// Edit the given permission's description
/// </summary>
/// <param name="rightName">the permission's name which need to be edit</param>
/// <param name="newDescription">new description</param>
public void EditGivenPermission(string newName,string oldName,string newDescription,string value)
{
XmlNode node = null;
string strXpath = string.Empty;
XmlElement newNode = null;
XmlAttribute attrName = null;
XmlAttribute attrValue = null;
XmlAttribute attrDescription = null;
XmlAttribute attrType = null;
try
{
strXpath = string.Format("/Permission/right[@name='{0}']",oldName);
node = document.DocumentElement.SelectSingleNode(strXpath);
newNode = document.CreateElement("right");
attrName = document.CreateAttribute("name");
attrValue = document.CreateAttribute("value");
attrType = document.CreateAttribute("type");
attrDescription = document.CreateAttribute("description");
attrName.Value = newName;
attrValue.Value = value;
attrDescription.Value = newDescription;
attrType.Value = node.Attributes["type"].Value;
newNode.SetAttributeNode(attrName);
newNode.SetAttributeNode(attrValue);
newNode.SetAttributeNode(attrDescription);
newNode.SetAttributeNode(attrType);
document.DocumentElement.ReplaceChild(newNode,node);
document.Save(XmlFilePath);
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
DataSet操作:
#region Transform the XML file format into table format
public DataTable GetTableFormat()
{
try
{
DataSet ds = new DataSet();
ds.ReadXml(XmlFilePath);
return ds.Tables[0];
}
catch (Exception ex)
{
throw ex;
}
}
public void AddItemToXML(string name,string right)
{
try
{
DataSet ds = new DataSet();
DataTable dt = GetTableFormat();
DataRow dr = dt.NewRow();
dr[0] = name;
dr[1] = right;
dt.Rows.Add(dr);
ds.Tables.Add(dt);
ds.WriteXml(XmlFilePath);
}
catch (Exception ex)
{
throw ex;
}
}
public void DeleteItemToXML(string name)
{
try
{
DataSet ds = new DataSet();
DataTable dt = GetTableFormat();
DataRow[] dr = dt.Select("name == '"+ name +"'");
dt.Rows.Remove(dr[0]);
ds.Tables.Add(dt);
ds.WriteXml(XmlFilePath);
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
Linq to XML的方式:
Linq to XML的方式就需要用到XElement操作了,XElement的扩展属性包含了Linq所有的功能,所以基本上把xml文件当作database或IEnumerable Object一样的数据源就行了。
//加载xml文件
XElement xmlDoc = XElement.Load(Path);
//查询节点
IEnumerable<XElement> lt = from n in xmlDoc.Elements("right")
where (string)n.Attribute("name") == code
select n;
String strReturn = lt.First<XElement>().Attribute("description").ToString();
//新增及修改
xmlDoc.SetElementValue(nodename,value);
//xml内容和字符串间的相互转换
StringBuilder strXmlContent = new StringBuilder();
strXmlContent.Append(XElement.Load(Path).ToString()); //xml Element转换成string;
xmlDoc = XElement.Parse(strXmlContent.ToString()); //String转换成XElement;
如果需要对xml文件进行验证,那么需要用到XDocument:
XmlSchemaSet schema = new XmlSchemaSet();
schema.add("","xxxx.xsd");
XDocument xmlDoc = XDocument.Load("xxx.xml");
xmlDoc.Validate(schema,(o,e) => { //
//匿名委托,处理你的验证业务逻辑
});
Linq to xml操作的其它特性还有事件,也就是说对xml节点的操作可以触发事件,这是其它方式所没有的:
XElement xmlDoc = root.Element("name");
xmlDoc.Changed += (object sender,XObjectChangeEventArgs e) =>
{
//throw new NotImplementedException();
//业务逻辑
};
XMLReader的操作,xmlreader提供向前只读读取xml数据流,并且提供异步读取方法,更多异步读取方法参考: http://msdn.microsoft.com/zh-cn/library/system.xml.xmlreader.aspx
以上是三种不同的操作方法,Linq提供了更多功能,并能快速定位到任何节点,只需要了解Linq的语法就可以操作,不需要了解xpath等规则。