1. 程式人生 > >C#對XML完整操作

C#對XML完整操作

C#對XML完整操作

http://zhidao.baidu.com/question/74181361.html

<?xml version="1.0"?>
<birthday>
<NO1>
   <type>型別</type>
   <date>時間</date>
   <title>資訊</title>
   <name>姓名</name>
</NO1>
<NO2>
   <type>型別</type>
   <date>時間</date>
   <title>資訊</title>
   <name>姓名</name>
</NO2>
</birthday>

1.XML資料格式如上,要求程式有讀.寫.編輯.刪除操作
2.請儘可能幫忙寫備註
3.xml資料讀入到treeview中,分別顯示各個欄位,並按時間順序排序
4.請不要複製網上程式碼,很多都是出現雜七雜八問題呢
5.程式碼請儘量簡潔
6.如果好用,再加感謝分^_^

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

回答一

//假定TreeView控制元件的id為treeView 

XmlDocument dom = new XmlDocument(); 
dom.Load("aaa.xml");//裝載XML文件 
//遍歷所有節點 
int num = 0;
foreach(XmlElement birthday in dom.DocumentElement.ChildNodes) 
{ 
//讀取資料 
string type = birthday.SelectSingleNode("type").InnerText; 
string date = birthday.SelectSingleNode("date").InnerText; 
string title = birthday.SelectSingleNode("title").InnerText; 
string name = birthday.SelectSingleNode("name").InnerText; 
string text = name + ":" + title;//節點文字 
string image = type;//節點圖片 
string data = num.ToString();//節點對應資料 
num++; 
//裝載示例,將新建的節點新增到TreeView 
TreeNode node = new TreeNode(text, data, image);//create a new node 
treeView.Nodes.Add(node); 
//編輯示例:將當前節點的生日更改為當前日期 
birthday.SelectSingleNode("date").InnerText = DateTime.Now.ToString(); 
//刪除示例:將當前節點刪除 
birthday.ParentNode.RemoveChild(birthday); 
} 
dom.Save();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

回答二

 

這是以前自己做過的一個測試。樓主可以參考一下。

=======================bookstore.XML內容====================
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
  <book>
  </book>
  <book>
  </book>
  <book genre="李贊紅" ISBN="2-3631-4">
    <title>CS從入門到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </book>
  <book genre="李贊紅" ISBN="2-3631-4">
    <title>CS從入門到精通</title>
    <author>候捷</author>
    <price>58.3</price>
  </book>
</bookstore>

=======================讀取========================
            XmlDocument doc = new XmlDocument();
            doc.Load(@"d:\bookstore.xml");
            XmlElement root = doc.DocumentElement;

MessageBox.Show(root.SelectNodes("book")[0].InnerText);

=======================新增=========================
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(@"d:\bookstore.xml");
            XmlNode root = xmlDoc.SelectSingleNode("bookstore");//查詢<bookstore>
            XmlElement xe1 = xmlDoc.CreateElement("book");//建立一個<book>節點
            xe1.SetAttribute("genre", "李贊紅");//設定該節點的genre屬性
            xe1.SetAttribute("ISBN", "2-3631-4");//設定該節點的ISBN屬性

            XmlElement xesub1 = xmlDoc.CreateElement("title");//新增一個名字為title的子節點
            xesub1.InnerText = "CS從入門到精通";//設定文字
            xe1.AppendChild(xesub1);//把title新增到<book>節點中

            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);//把book新增到<bookstore>根節點中
            xmlDoc.Save(@"d:\bookstore.xml");

======================修改========================
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(@"d:\bookstore.xml");
            XmlNodeList nodeList = xmlDoc.SelectSingleNode("bookstore").ChildNodes;//獲取bookstore節點的所有子節點
            foreach (XmlNode xn in nodeList)//遍歷所有名字為bookstore的子節點
            {
                XmlElement xe = (XmlElement)xn;//將子節點型別轉換為XmlElement型別
                if (xe.GetAttribute("genre") == "李贊紅")//如果genre屬性值為“李贊紅”
                {
                    xe.SetAttribute("genre", "update李贊紅");//則修改該屬性為“update李贊紅”

                    XmlNodeList nls = xe.ChildNodes;//繼續獲取xe(xn)子節點的所有子節點
                    foreach (XmlNode xn1 in nls)//遍歷
                    {
                        XmlElement xe2 = (XmlElement)xn1;//轉換型別
                        if (xe2.Name == "author")//如果找到
                        {
                            xe2.InnerText = "亞勝";//則修改
                            break;//找到退出來
                        }
                    }
                    break;
                }
            }
            xmlDoc.Save(@"d:\bookstore.xml");//儲存。

========================刪除=========================

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(@"d:\bookstore.xml");
            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(@"d:\bookstore.xml");

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

回答三

 

方法一 :使用XML控制元件
    <% @ Page Language="C#"%>
<html>
<body> 
       <h3><font face="Verdana">讀取XML方法一</font></h3>
       <from runat=server>
        <asp:Xml id="xml1" DocumentSource="grade.xml" runat="server" />
      </from>

</body>
</html>

方法二: 使用DOM技術
<% @ Page Language="C#"%>
<% @ Import Namespace="System.Xml"%>
<% @ Import Namespace="System.Xml.Xsl"%>
<html>
<script language="C#" runat="server">
void Page_Load(Object sender,EventArgs e)
{
   XmlDocument doc=new XmlDocument();
doc.Load(Server.MapPath("grade.xml"));
xml1.Document=doc;
}
</script>
<body>
   <h3><font face="Verdana">讀取XML方法二</font></h3>
       <from runat=server>
        <asp:Xml id="xml1" runat="server" />
      </from>

</body>
</html>

方法三 :使用DataSet物件
<% @ Page Language="C#"%>
<% @ Import Namespace="System.Data"%>
<% @ Import Namespace="System.Data.OleDb"%>
<script language="C#" runat="server">
void Page_Load(Object sender,EventArgs e)
{
DataSet   objDataSet=new DataSet();
objDataSet.ReadXml(Server.MapPath("grade.xml"));
dgEmployees.DataSource=objDataSet.Tables["student"].DefaultView;
dgEmployees.DataBind();
}
</script>
<body>
   <h3><font face="Verdana">讀取XML方法三</font></h3>
<asp:DataGrid id="dgEmployees" runat="server" />

</body>
</html>

方法四 :按文字方式讀取
<% @ Page Language="C#"%>
<% @ Import Namespace="System.Xml"%>
<html>
<script language="C#" runat="server">
private void Page_Load(Object sender,EventArgs e)
{
XmlTextReader objXMLReader=new XmlTextReader(Server.MapPath("grade.xml"));
string strNodeResult="";
XmlNodeType objNodeType;
while(objXMLReader.Read())
{
objNodeType =objXMLReader.NodeType;
swith(objNodeType)
   {
   case XmlNodeType.XmlDeclaration:
   //讀取XML檔案頭
      strNodeResult+="XML Declaration:<b>"+objXMLReader.Name+""+objXMLReader.Value+"</b><br/>";
     break;
   case XmlNodeType.Element:
//讀取標籤
     strNodeResult+="Element:<b>"+objXMLReader.Name+"</b><br/>";
    break;
    case XmlNodeType.Text:
     //讀取值
    strNodeResult+=" -Value:<b>"+objXMLReader.Value+"</b><br/>";
   break;

   }
//判斷該節點是否有屬性
if(objXMLReader.AttributeCount>0)
{ //用迴圈判斷完所有節點
    while(objXMLReader.MoveToNextAttibute)
     { //取標籤和值
     strNodeResult+=" -Attribute:<b>"+objXMLReader.Name+"</b> value:<b>"+objXMLReader.Value+"</b><br/>";
      }
   }
LblFile.Text=strNodeResult;
}
}
</script>
<body>
   <h3><font face="Verdana">讀取XML方法四</font></h3>
       <from runat=server>
        <asp:label id="LblFile" runat="server" />
      </from>

</body>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

回答四

我用的是一種很笨的方法,但可以幫助初學者瞭解訪問XML節點的過程。 
已知有一個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...  
  
2005-10-3 
一個通過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...  
  

2005-10-3 
一個通過DataSet操作XML的類  


  這段時間寫的專案每次都要用到XML儲存一些配置,而每次操作XML都覺得挺麻煩,沒有資料庫那麼順手。後來發現用DataSet操作XML很方便,而且靈活性比較好,於是寫了一個操作XML的類,用來應付一般的XML操作(原始碼下載附件)。 

  1 基本思路 
  其實用DataSet操作XML,歸根到底就是對DataSet裡的表格,行,列等進行操作,然後用DataSet裡的東西重新寫到XML中,從而實現編輯XML的目的。如果再配合上.xsd檔案的話,那效果更佳。 

  2 程式詳解 
  (1) XML檔案內容 
  本類操作的XML和生成的XML格式是一樣的,如下: 


http://tempuri.org/xml_xmlDB.xsd"> 

2 Asp.net程式設計師 

開發B/S結構程式 
asp.net c#等 

建國路XXX 

2008-8-31 
false 


c#程式設計師 

開發B/S結構程式 
asp.net c#等 

建國路XXX 

2008-8-31 
false 

  然後點選XML檔案右下角的“資料”,即可看到熟悉的表格形式,在表格的任意位置上單擊右鍵選擇“建立架構”,將會生成一個.xsd檔案,該檔案用來定義XML各列的型別。其內容如下(點選檢視程式碼2附件): 

http://tempuri.org/xml_xmlDB.xsd"  xmlns:mstns="http://tempuri.org/xml_xmlDB.xsd"xmlns="http://tempuri.org/xml_xmlDB.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"attributeFormDefault="qualified" elementFormDefault="qualified"> msdata:Locale="zh-CN" msdata:EnforceConstaints="False">?msdata:AutoIncrement="true" msdata:AutoIncrementStep="1"msdata:AutoIncrementSeed="1" /> 
  


  注意:如果想像資料庫一樣有一個自動增長的ID欄位,則可以這樣操作: 
  首先在XML中新增一個元素,這樣生成.xsd的時候,就會有一個ID段,在.xsd中選中ID這一列,在右邊的屬性中,將“AutoIncrementSeed”和“AutoIncrementStep”分別設定為1,這樣ID就會從1開始以步長為1自動增長。 

  以上程式碼如果看不懂並不要緊,因為我們可以通過DataSet來生成這種格式的內容。接下來將開始操作XML。 

  (2) 處理XML檔案路徑 
  這裡主要是對傳入的XML路徑進行處理,如果傳入的是相對路徑,則返回完整路徑,如果傳入的是完整路徑,則不做處理直接返回。方法如下: 

#region GetXmlFullPath 
///  
/// 返回完整路徑 
///  
/// Xml的路徑 
///  
public static string GetXmlFullPath(string strPath) 

//如果路徑中含有:符號,則認定為傳入的是完整路徑  
if(strPath.IndexOf(":") > 0) 

return strPath; 

else 

//返回完整路徑 
return System.Web.HttpContext.Current.Server.MapPath(strPath); 


#endregion  


  (3) 讀取記錄 
  讀取XML的資料到DataSet中的方法為: 

#region GetDataSetByXml 
///  
/// 讀取xml直接返回DataSet 
///  
/// xml檔案相對路徑 
///  
public static DataSet GetDataSetByXml(string strXmlPath) 

try 

DataSet ds = new DataSet(); 
//讀取XML到DataSet 
ds.ReadXml(GetXmlFullPath(strXmlPath)); 
if(ds.Tables.Count > 0) 

return ds; 

return null; 

catch(Exception) 

return null; 


#endregion 
  


  以上方法將得到一個DataSet,裡面儲存的是全部XML記錄的資訊,而且沒有經過任何處理。但很多時候我們需要的只是一些滿足條件的記錄,這時需要用以下方法得到: 

#region GetDataViewByXml 
/// 〈summary〉 
/// 讀取Xml返回一個經排序或篩選後的DataView 
/// 〈/summary〉 
/// 〈param name="strXmlPath"〉〈/param〉 
/// 〈param name="strWhere"〉篩選條件,如:"name = 'kgdiwss'"〈/param〉 
/// 〈param name="strSort"〉排序條件,如:"Id desc"〈/param〉 
/// 〈returns〉〈/returns〉 
public static DataView GetDataViewByXml(string strXmlPath,string strWhere,string strSort) 

try 

DataSet ds = new DataSet(); 
ds.ReadXml(GetXmlFullPath(strXmlPath)); 
//建立DataView來完成排序或篩選操作 
DataView dv = new DataView(ds.Tables[0]); 
if(strSort != null) 

//對DataView中的記錄進行排序 
dv.Sort = strSort; 

if(strWhere != null) 

//對DataView中的記錄進行篩選,找到我們想要的記錄 
dv.RowFilter = strWhere; 

return dv; 

catch(Exception) 

return null; 


#endregion  

  


  (4) 插入記錄 
  到現在為止我們已經可以隨意讀取XML中的記錄,接下來來實現寫入XML的操作,方法如下: 

#region WriteXmlByDataSet 
/// 〈summary〉 
/// 向Xml檔案插入一行資料 
/// 〈/summary〉 
/// 〈param name="strXmlPath"〉xml檔案相對路徑〈/param〉 
/// 〈param name="Columns"〉要插入行的列名陣列,如:string[] Columns = {"name","IsMarried"};〈/param〉 
/// 〈param name="ColumnValue"〉要插入行每列的值陣列,如:string[] ColumnValue={"kgdiwss","false"};〈/param〉 
/// 〈returns〉成功返回true,否則返回false〈/returns〉 
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 
  


  可能有的朋友不知道怎麼用這個方法插入資料,在後面我將用例項介紹。 

  (5) 修改記錄 
  修改記錄的方法要傳入的引數相對較多,因為修改記錄需要先定位到具體哪一條記錄,再修改指定列的值,以下為修改XML的方法: 

#region UpdateXmlRow 
/// 〈summary〉 
/// 更行符合條件的一條Xml記錄 
/// 〈/summary〉 
/// 〈param name="strXmlPath"〉XML檔案路徑〈/param〉 
/// 〈param name="Columns"〉列名陣列〈/param〉 
/// 〈param name="ColumnValue"〉列值陣列〈/param〉 
/// 〈param name="strWhereColumnName"〉條件列名〈/param〉 
/// 〈param name="strWhereColumnValue"〉條件列值〈/param〉 
/// 〈returns〉〈/returns〉 
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 
  

  


  (6) 刪除記錄 
  為了方便,刪除記錄提供了三個方法,一個可以刪除所有記錄,一個刪除符合條件的行,還有一個刪除指定Index值的行,該Index值和記錄在Data 
  Set中的Index值對應。刪除所有記錄的方法為: 

#region DeleteXmlAllRows 
/// 〈summary〉 
/// 刪除所有行 
/// 〈/summary〉 
/// 〈param name="strXmlPath"〉XML路徑〈/param〉 
/// 〈returns〉〈/returns〉 
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 
刪除指定Index值的行的方法為: 
#region DeleteXmlRowByIndex 
/// 〈summary〉 
/// 通過刪除DataSet中iDeleteRow這一行,然後重寫Xml以實現刪除指定行 
/// 〈/summary〉 
/// 〈param name="strXmlPath"〉〈/param〉 
/// 〈param name="iDeleteRow"〉要刪除的行在DataSet中的Index值〈/param〉 
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 
  


   這裡說一下提供此方法的原因,有的時候將XML的內容讀到DataSet,然後繫結到DataGrid後,由於DataGrid中只有一個模板列,而模 板列裡又套了表格等許多控制元件,這就使得我們可能無法得到記錄對應的ID值,這個時候就可以先得到記錄的Index值(第一行為0,第二行為1,以此類 推),然後將該Index值傳到方法中,就可以將該記錄刪掉。 

  注意:使用該方法的時候,繫結到DataGrid上的DataSet和刪除時用的DataSet要為同一個,也就是說Index要相同,不能有排序,不然會誤將記錄。 

  有時候我們需要刪除符合條件的多行,這個時候可以用以下方法實現: 

#region DeleteXmlRows 
/// 〈summary〉 
/// 刪除strColumn列中值為ColumnValue的行 
/// 〈/summary〉 
/// 〈param name="strXmlPath"〉xml相對路徑〈/param〉 
/// 〈param name="strColumn"〉列名〈/param〉 
/// 〈param name="ColumnValue"〉strColumn列中值為ColumnValue的行均會被刪除〈/param〉 
/// 〈returns〉〈/returns〉 
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 
  

  

3例項解析 

  (7) 讀取XML 
  以下程式碼讀取到一個沒有排序和篩選的DataSet。 
DataGrid1.DataSource = OperateXmlByDataSet.GetDataSetByXml(@"xml/xml_xmlDB.xml"); 
DataGrid1.DataBind(); 
以下程式碼讀到的資料是經過篩選和排序的: 
DataGrid1.DataSource = OperateXmlByDataSet.GetDataViewByXml( 
@"xml/xml_xmlDB.xml", //XML檔案路徑 
"name = 'Asp.net'", //條件:name列值為Asp.net 
"peopleNum desc"); //按peopleNum列降序排列 
DataGrid1.DataBind(); 
  


  (8) 新增記錄 
  以下程式碼向XML檔案中添加了一條記錄,同時給7個列賦值: 
bool b; 
b = OperateXmlByDataSet.WriteXmlByDataSet( 
@"xml/xml_xmlDB.xml", //XML檔案地址 
new string[]{ 
"name", //姓名欄位 
"peopleNum", //人數字段 
"address", //地址欄位 
"description", //描述欄位 
"require", //需求欄位 
"deadLine", //結束時間欄位 
"IsMarried" //婚否欄位 
}, 
new string[]{ 
"Asp.net程式設計師", //姓名欄位值 
"2", //人數字段值 
"建國路", //地址欄位值 
"B/S結構程式", //描述欄位值 
"asp.net c#等", //需求欄位值 
DateTime.Now.ToShortDateString(), //結束時間欄位值 
"false" //婚否欄位值 
}); 
  


  如果b返回值為true,表示新增成功,否則表示新增失敗。以上的寫法我用了些偷懶的方法,比如我把陣列直接放在引數,而沒有另外申明,事實上你可以另外申明一個數組,然後再傳到方法中。 
  請注意欄位在陣列中的位置和值在陣列中的位置的對應關係。 

  (9) 修改記錄 
  以下程式碼將找到peopleNum列值為3的行,然後將行的name、peopleNum、、description和IsMarried四個欄位的值分別更新成kgdiwss、10、描述、true。 
bool b; 
b = OperateXmlByDataSet.UpdateXmlRow( 
@"xml/xml_xmlDB.xml", 
new string[]{"name","peopleNum","description","IsMarried"}, 
new string[]{"kgdiwss","10","描述","true"}, 
"peopleNum", 
"3"); 
  


  返回true表示修改成功,否則表示修改失敗。 
  請特別注意,欄位型別為邏輯型時,賦值用的是true和false,而不是0和1。 

  (10) 刪除記錄 
  以下程式碼實現刪除name列值為陣列中的值的行。 
bool b; 
b = OperateXmlByDataSet.DeleteXmlRows( 
@"xml/xml_xmlDB.xml", //XML檔案路徑 
"name", //條件列 
new string[]{ 
"值1", //條件值1 
"值2", //條件值2 
"值3" //條件值3 
}); 
  


  上面程式碼執行成功後,name列值為值1、值2、值3的行將被刪除。 
  刪除成功返回true,否則返回false。 
  另外兩種刪除的方法用法比較簡單,這裡就不介紹了。 

  以上就是操作XML的所有方法,相信可以滿足很大一部份的使用了。然而,如果XML中的資料量比較大的話,使用以上方法效率可能不高,但話又說回來,如果資料量比較大的話,還是選擇資料庫比較好。