基于xml技术的操作
Xml是一种存放文件的一个文件格式,在程序的开发中应用很广泛,下面就来看看如何通过DOM的方式处理Xml格式的数据。DOM(Document Object Model,文档对象模型),DOM是处理Xml数据的国际通用数据模型,由于Xml以元素为单位,就一个根节点,所有非常适合树的形式表达,DOM将xml格式的看出一棵树,并定义了一种将xml文档中的元素和属性对应特点节点,因此,可以认为Dom定义了xml在内存中的表示形式!
既然可以把xml文档可以转换成内存中的DOM树,那么我们就可以通过程序对XML进行操作了,由此可见DOM处理xml的重要性,下面介绍几个常见对XML处理的类
1、XmlNode类
.net中定义了1个抽象类XmlNode类来表示XML树中的所有节点,包括很多Xml文档操作的属性和方法,如Arributes,ChildNodes,FirstChild,AppendChild(),InsertAfter()等等,在用的时候慢慢体会就可以了
2、XmlDocument类
XmlDocument类扩展了XmlNode,并代表XML文档。它是内存的读取器,在内存中将xml数据用树形结构来表达,,它允许往返遍历树的各个节点,允许对节点进行读取和修改,也包括很多属性和方法,事件等,集中load方法是将xml文档加载到内存中的。
下面就来详细介绍下对xml的操作,包括读写更新等操作,以下面的xml文件为例
<Users>
<User id="0">
<Name>Jeffrey</Name>
<Sex>男</Sex>
<UserName>Jeffrey</UserName>
</User>
<User id="1">
<Name>Tom</Name>
<Sex>男</Sex>
<UserName>tom</UserName>
</User>
<User id="2">
<Name>Jef</Name>
<Sex>女</Sex>
<UserName>jef</UserName>
</User>
<User id="3">
<Name>1</Name>
<Sex>男</Sex>
<UserName>1</UserName>
</User>
</Users>
一、读取
操作xml文件之前首先我们需要创建xml文档读取器,并将xml文件加载到内存中
xdoc.Load(System.Environment.CurrentDirectory + "\\UsersXml.xml");
其次,我们来搞清几个节点类
XmlNodeList:所有节点的集合,无论是父节点还是子节点
XmlNode:xml文档中的单个节点
XmlAttribute:单个节点中的属性,可以通过Name获得值
弄清楚了上面的三个节点类后,我们就可以根据需要获得对应的元素了,下面我们来看看如何获得它们
a.首先我们来获得节点集合xmlNodeList
foreach (XmlNode node in list)
{
listBox1.Items.Add(node.ChildNodes.Item(0).InnerText);
}
SelectNodes方法主要用来获得节点集合的方法,括号里的参数主要是用来说明要显示的节点集合,比如/Users就是显示Users的集合,/Users/User就是User的节点集合等,然后循环出来就可以了,我们也可以根据条件进行筛选,比如根据子节点的属性值,子节点的节点值等,举个例子
比如我要显示子节点中sex为男的所有User节点集合,那么我们就可以这样写
View Code
foreach (XmlNode node in list)
{
listBox1.Items.Add(node.ChildNodes.Item(0).InnerText);
}
或者根据子节点属性来筛选,比如读取user中id>2的节点
foreach (XmlNode node in list)
{
if (Convert.ToInt32(node.Attributes["id"].Value)>2)
{
listBox1.Items.Add(node.ChildNodes.Item(0).InnerText);
}
}
b、获得单个节点XmlNode
listBox1.Items.Add(xnode.Attributes["id"].Value);
这里面使用了SelectSingleNode来获得单个节点,需要说明的是里面的参数同上,只是为了精确,最好都是加上条件的,或者通过其他的FirstChild等也可以获得
c、获得单个节点XmlAttribute,这个我们只需要遍历单个节点的属性,就可以获得,下面举个例子,比如对下面的xml操作
<Products>
<Product id="0" proName="手机" proPrice="1200" proInfo="手机手机手机手机手机手机"></Product>
<Product id="1" proName="电脑" proPrice="3200" proInfo="电脑电脑电脑电脑电脑电脑"></Product>
<Product id="5" proName="mp3" proPrice="200" proInfo="mp3mp3mp3mp3mp3mp3mp3mp3mp3"></Product>
<Product id="3" proName="mp4" proPrice="400" proInfo="mp4mp4mp4mp4mp4mp4mp4mp4mp4"></Product>
<Product id="4" proName="mp5" proPrice="500" proInfo="mp5mp5mp5mp5mp5mp5mp5mp5mp5"></Product>
</Products>
看看下面的源码,实现了DataTable和xml节点属性的使用
{
//创建XmlDocument类的实例
XmlDocument xmldocument = new XmlDocument();
//加载xml文件
xmldocument.Load(path);
//通过SelectSingleNode方法获得根节点
XmlNode xmlNode = xmldocument.SelectSingleNode("Products");
//判断根节点和根节点下是否为空
if (xmlNode==null)
{
return null;
}
if(xmlNode.ChildNodes.Count<=0)
{
return null;
}
//创建DataTable对象
DataTable dt = new DataTable();
//读取xml根节点下第一个节点的属性值到DataTable的列中,用来定义DataTable结构
foreach (XmlAttribute att in xmlNode.ChildNodes[0].Attributes)
{
dt.Columns.Add(new DataColumn(att.Name,typeof(string)));
}
//获取XML节点下的所有节点
XmlNodeList nodeList = xmldocument.SelectNodes("/Products/Product");
//遍历所有节点
foreach (XmlNode xn in nodeList)
{
//定义行
DataRow dr = dt.NewRow();
//在行中添加数据
foreach (DataColumn column in dt.Columns)
{
dr[column] = xn.Attributes[column.ColumnName].Value;
}
// 将行添加到表格中
dt.Rows.Add(dr);
}
//返回DataTable对象dt即可
return dt;
}
理解了上面的这些后,我们就可以很灵活的对xml进行操作了,比如结合DataSet的使用,因为有的时候,我们需要xml的数据读取到DataSet中去操作,从而进行绑定数据集,获取值等,比如对products.xml这个来说,有个简单的加载到dataset的方法
ds.ReadXml(reader);//以XML方式读取到dataset中。
二、增加xml节点
增加节点无非就是增加子节点,增加节点的属性和节点值等,就以上面Users.xml为例子,看看如何操作
首先需要加载xml文档到内存中,创建读写器
xdoc.Load(System.Environment.CurrentDirectory + "\\UsersXml.xml");
其次,需要制定xpath,就是将节点加到上面地方,在这里我们需要加载到Users下面
现在,我们先创建一个User节点
我们看到User节点里会有一个id属性,而且还有值,那么我们就要创建一个id属性,添加到newNode节点中
idattr.Value = id;
newNode.Attributes.Append(idattr);
然后,我们在创建User下面的子节点Name,sex,username,从而添加到newNode中
XmlNode nameNode = xdoc.CreateNode(XmlNodeType.Element, "Name", null);
nameNode.InnerText = textBox3.Text;
newNode.AppendChild(nameNode);
XmlNode sexNode = xdoc.CreateNode(XmlNodeType.Element, "Sex", null);
sexNode.InnerText = textBox4.Text;
newNode.AppendChild(sexNode);
XmlNode unNode = xdoc.CreateNode(XmlNodeType.Element, "UserName", null);
unNode.InnerText = textBox2.Text;
newNode.AppendChild(unNode);
最后,将newNode添加到父节点Users中,保存xml文档即可
xdoc.Save(System.Environment.CurrentDirectory + "\\UsersXml.xml");
我们可以发现,无论是创建节点还是属性,都是通过xmldocument来创建的
三、修改节点
这个思路也很简单,只要我们获取需要修改的节点,然后在重新赋值就可以了,可以根据参数获得,也可以使用属性判断,总之方式很多,简单的写了个例子
xdoc.Load(System.Environment.CurrentDirectory + "\\UsersXml.xml");
string username = textBox2.Text;
string name = textBox3.Text;
string sex = textBox4.Text;
XmlNode node = xdoc.SelectSingleNode("/Users/User[Name='测试']");
node.ChildNodes.Item(0).InnerText = name;
node.ChildNodes.Item(1).InnerText = sex;
node.ChildNodes.Item(2).InnerText = username;
xdoc.Save(System.Environment.CurrentDirectory + "\\UsersXml.xml");
四、删除节点
获得要删除的节点,调用removeChild方法进行移除
xdoc.Load(System.Environment.CurrentDirectory + "\\UsersXml.xml");
string username = textBox1.Text;
XmlNode node = xdoc.SelectSingleNode("/Users/User[Name='" + username + "']");
XmlNode ParentNode = node.ParentNode;
ParentNode.RemoveChild(node);
xdoc.Save(System.Environment.CurrentDirectory + "\\UsersXml.xml");
上面就是简单的对xml的操作,可以灵活变通,通过序列化,也可以完成相关操作