欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# XML操作 代码大全(读XML,写XML,更新,删除节点,与dataset结合等)第1/2页

程序员文章站 2022-07-04 17:19:35
已知有一个xml文件(bookstore.xml)如下: corets, eva 5.95 1、插入节点 往节点中插入一个节点: 复制代码 代码如下:xmldocument...
已知有一个xml文件(bookstore.xml)如下:
corets, eva
5.95
1、插入节点
往节点中插入一个节点:
复制代码 代码如下:

xmldocument xmldoc=new xmldocument();
xmldoc.load("bookstore.xml");
xmlnode root=xmldoc.selectsinglenode("bookstore");//查找
xmlelement xe1=xmldoc.createelement("book");//创建一个节点
xe1.setattribute("genre","李赞红");//设置该节点genre属性
xe1.setattribute("isbn","2-3631-4");//设置该节点isbn属性

xmlelement xesub1=xmldoc.createelement("title");
xesub1.innertext="cs从入门到精通";//设置文本节点
xe1.appendchild(xesub1);//添加到节点中
xmlelement xesub2=xmldoc.createelement("author");
xesub2.innertext="候捷";
xe1.appendchild(xesub2);
xmlelement xesub3=xmldoc.createelement("price");
xesub3.innertext="58.3";
xe1.appendchild(xesub3);

root.appendchild(xe1);//添加到节点中
xmldoc.save("bookstore.xml");

结果为:
corets, eva
5.95
候捷
58.3
2、修改节点:
将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点的文本修改为“亚胜”。

复制代码 代码如下:

xmlnodelist nodelist=xmldoc.selectsinglenode("bookstore").childnodes;//获取bookstore节点的所有子节点
foreach(xmlnode xn in nodelist)//遍历所有子节点
{
xmlelement xe=(xmlelement)xn;//将子节点类型转换为xmlelement类型
if(xe.getattribute("genre")=="李赞红")//如果genre属性值为“李赞红”
{
xe.setattribute("genre","update李赞红");//则修改该属性为“update李赞红”

xmlnodelist nls=xe.childnodes;//继续获取xe子节点的所有子节点
foreach(xmlnode xn1 in nls)//遍历
{
xmlelement xe2=(xmlelement)xn1;//转换类型
if(xe2.name=="author")//如果找到
{
xe2.innertext="亚胜";//则修改
break;//找到退出来就可以了
}
}
break;
}
}
xmldoc.save("bookstore.xml");//保存。

最后结果为:
corets, eva
5.95
亚胜
58.3
3、删除节点
节点的genre属性,删除 节点。

复制代码 代码如下:

xmlnodelist xnl=xmldoc.selectsinglenode("bookstore").childnodes;

foreach(xmlnode xn in xnl)
{
xmlelement xe=(xmlelement)xn;
if(xe.getattribute("genre")=="fantasy")
{
xe.removeattribute("genre");//删除genre属性
}
else if(xe.getattribute("genre")=="update李赞红")
{
xe.removeall();//删除该节点的全部内容
}
}
xmldoc.save("bookstore.xml");

最后结果为:
corets, eva
5.95
4、显示所有数据。

复制代码 代码如下:

xmlnode xn=xmldoc.selectsinglenode("bookstore");

xmlnodelist xnl=xn.childnodes;

foreach(xmlnode xnf in xnl)
{
xmlelement xe=(xmlelement)xnf;
console.writeline(xe.getattribute("genre"));//显示属性值
console.writeline(xe.getattribute("isbn"));

xmlnodelist xnf1=xe.childnodes;
foreach(xmlnode xn2 in xnf1)
{
console.writeline(xn2.innertext);//显示子节点点文本
}
}

loading...


一个通过dataset操作xml的类(源代码)


复制代码 代码如下:

using system;
using system.data;
using system.xml;
using system.windows.forms;

//***************************************
// 作者: ∮明天去要饭
// qicq: 305725744
// .net群: 6370988
// http://blog.csdn.net/kgdiwss
//***************************************

namespace ystrp.common
{
///
/// operatexmlbydataset 的摘要说明。
///
public class operatexmlbydataset
{
public operatexmlbydataset()
{
//
// todo: 在此处添加构造函数逻辑
//
}

#region getdatasetbyxml
///
/// 读取xml直接返回dataset
///
/// xml文件相对路径
///
public static dataset getdatasetbyxml(string strxmlpath)
{
try
{
dataset ds = new dataset();
ds.readxml(getxmlfullpath(strxmlpath));
if(ds.tables.count > 0)
{
return ds;
}
return null;
}
catch(exception ex)
{
system.windows.forms.messagebox.show(ex.tostring());
return null;
}
}
#endregion
#region getdataviewbyxml
///
/// 读取xml返回一个经排序或筛选后的dataview
///
///
/// 筛选条件,如:"name = 'kgdiwss'"
/// 排序条件,如:"id desc"
///
public static dataview getdataviewbyxml(string strxmlpath,string strwhere,string strsort)
{
try
{
dataset ds = new dataset();
ds.readxml(getxmlfullpath(strxmlpath));
dataview dv = new dataview(ds.tables[0]);
if(strsort != null)
{
dv.sort = strsort;
}
if(strwhere != null)
{
dv.rowfilter = strwhere;
}
return dv;
}
catch(exception)
{
return null;
}
}
#endregion


#region writexmlbydataset
///
/// 向xml文件插入一行数据
///
/// xml文件相对路径
/// 要插入行的列名数组,如:string[] columns = {"name","ismarried"};
/// 要插入行每列的值数组,如:string[] columnvalue={"明天去要饭","false"};
/// 成功返回true,否则返回false
public static bool writexmlbydataset(string strxmlpath,string[] columns,string[] columnvalue)
{
try
{
//根据传入的xml路径得到.xsd的路径,两个文件放在同一个目录下
string strxsdpath = strxmlpath.substring(0,strxmlpath.indexof(".")) + ".xsd";

dataset ds = new dataset();
//读xml架构,关系到列的数据类型
ds.readxmlschema(getxmlfullpath(strxsdpath));
ds.readxml(getxmlfullpath(strxmlpath));
datatable dt = ds.tables[0];
//在原来的表格基础上创建新行
datarow newrow = dt.newrow();

//循环给一行中的各个列赋值
for(int i=0; i< columns.length; i++)
{
newrow[columns[i]] = columnvalue[i];
}
dt.rows.add(newrow);
dt.acceptchanges();
ds.acceptchanges();

ds.writexml(getxmlfullpath(strxmlpath));
return true;
}
catch(exception)
{
return false;
}
}
#endregion


#region updatexmlrow
///
/// 更行符合条件的一条xml记录
///
/// xml文件路径
/// 列名数组
/// 列值数组
/// 条件列名
/// 条件列值
///
public static bool updatexmlrow(string strxmlpath,string[] columns,string[] columnvalue,string strwherecolumnname,string strwherecolumnvalue)
{
try
{
string strxsdpath = strxmlpath.substring(0,strxmlpath.indexof(".")) + ".xsd";

dataset ds = new dataset();
//读xml架构,关系到列的数据类型
ds.readxmlschema(getxmlfullpath(strxsdpath));
ds.readxml(getxmlfullpath(strxmlpath));

//先判断行数
if(ds.tables[0].rows.count > 0)
{
for(int i=0; i< ds.tables[0].rows.count; i++)
{
//如果当前记录为符合where条件的记录
if(ds.tables[0].rows[i][strwherecolumnname].tostring().trim().equals(strwherecolumnvalue))
{
//循环给找到行的各列赋新值
for(int j=0; j < columns.length; j++)
{
ds.tables[0].rows[i][columns[j]] = columnvalue[j];
}
//更新dataset
ds.acceptchanges();
//重新写入xml文件
ds.writexml(getxmlfullpath(strxmlpath));
return true;
}
}

}
return false;
}
catch(exception)
{
return false;
}
}
#endregion


#region deletexmlrowbyindex
///
/// 通过删除dataset中ideleterow这一行,然后重写xml以实现删除指定行
///
///
/// 要删除的行在dataset中的index值
public static bool deletexmlrowbyindex(string strxmlpath,int ideleterow)
{
try
{
dataset ds = new dataset();
ds.readxml(getxmlfullpath(strxmlpath));
if(ds.tables[0].rows.count > 0)
{
//删除符号条件的行
ds.tables[0].rows[ideleterow].delete();
}
ds.writexml(getxmlfullpath(strxmlpath));
return true;
}
catch(exception)
{
return false;
}
}
#endregion


#region deletexmlrows
///
/// 删除strcolumn列中值为columnvalue的行
///
/// xml相对路径
/// 列名
/// strcolumn列中值为columnvalue的行均会被删除
///
public static bool deletexmlrows(string strxmlpath,string strcolumn,string[] columnvalue)
{
try
{
dataset ds = new dataset();
ds.readxml(getxmlfullpath(strxmlpath));

//先判断行数
if(ds.tables[0].rows.count > 0)
{
//判断行多还是删除的值多,多的for循环放在里面
if(columnvalue.length > ds.tables[0].rows.count)
{
for(int i=0; i < ds.tables[0].rows.count; i++)
{
for(int j=0; j < columnvalue.length; j++)
{
if(ds.tables[0].rows[i][strcolumn].tostring().trim().equals(columnvalue[j]))
{
ds.tables[0].rows[i].delete();
}
}
}
}
else
{
for(int j=0; j < columnvalue.length; j++)
{
for(int i=0; i < ds.tables[0].rows.count; i++)
{
if(ds.tables[0].rows[i][strcolumn].tostring().trim().equals(columnvalue[j]))
{
ds.tables[0].rows[i].delete();
}
}
}
}
ds.writexml(getxmlfullpath(strxmlpath));
}
return true;
}
catch(exception)
{
return false;
}
}
#endregion


#region deletexmlallrows
///
/// 删除所有行
///
/// xml路径
///
public static bool deletexmlallrows(string strxmlpath)
{
try
{
dataset ds = new dataset();
ds.readxml(getxmlfullpath(strxmlpath));
//如果记录条数大于0
if(ds.tables[0].rows.count > 0)
{
//移除所有记录
ds.tables[0].rows.clear();
}
//重新写入,这时xml文件中就只剩根节点了
ds.writexml(getxmlfullpath(strxmlpath));
return true;
}
catch(exception)
{
return false;
}
}
#endregion


#region getxmlfullpath
///
/// 返回完整路径
///
/// xml的路径
///
public static string getxmlfullpath(string strpath)
{
if(strpath.indexof(":") > 0)
{
return strpath;
}
else
{
return application.startuppath + strpath;
}
}
#endregion
}
}

loading...
1