当前位置:K88软件开发文章中心编程语言.NET.NET01 → 文章内容

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

减小字体 增大字体 作者:     来源:asp编程网  发布时间:2018-12-30 7:42:29

已知有一个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/2页 
12下一页阅读全文

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