C# XML操作 代碼大全(讀XML,寫XML,更新,刪除節點,與dataset結合等)第1/2頁

http://www.loliman3000.com/tech/2fe13b6a38e0bab864d80365.php
http://www.tzwhx.com/NewShow/newClassCShow/XML%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B_133.html
http://www.tzwhx.com/NewShow/newClassShow/XML_13.html

已知有一個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
}
}

ASP.NET利用xpath來取得單一(SelectSingleNode)或多個(SelectNodes)xml node的運用

  

小弟最近在討論區看到很多人問有關xml的問題…就給它記錄在我的blog裡…
假設有一個xml檔內容如下..
01<?xml version=”1.0″ encoding=”utf-8″ ?>
02<A>
03  <B>
04    <C c1=”東京”>JAPAN</C>
05  </B>
06  <B>
07    <C c1=”台北”>TAIWAN</C>
08    <C c1=”台南”>TAIWAN</C>
09  </B>
10  <B>
11    <C c1=”北京”>CHINA</C>
12  </B>
13</A>
要如何取出xml檔某結點裡的內容或屬性內容….下面有一個簡單的範例..使用xpath作法…
asp.net(c#)部分程式碼
01using System;
02using System.Collections;
03using System.Configuration;
04using System.Data;
05using System.Web;
06using System.Web.Security;
07using System.Web.UI;
08using System.Web.UI.HtmlControls;
09using System.Web.UI.WebControls;
10using System.Web.UI.WebControls.WebParts;
11using System.Xml;
12
13public partial class XPATH : System.Web.UI.Page
14{
15    protected void Page_Load(object sender, EventArgs e)
16    {
17        XmlDocument xmldoc = new XmlDocument();
18        xmldoc.Load(Server.MapPath(“XML.xml”));//載入xml檔
19
20        string xPathExpression1 = “/A/B/C[.=’TAIWAN’]”;//找node裡有’TAIWAN’
21        XmlNodeList nodelist = xmldoc.SelectNodes(xPathExpression1);//multi node
22
23        string xPathExpression2 = “/A/B/C[@c1=’台北’]”;//找node屬性有’台北’
24        XmlNode node = xmldoc.SelectSingleNode(xPathExpression2);//single node
25
26        //輸出結果:TAIWAN
27        Response.Write(node.OuterXml);
28
29        Response.Write(“<p>”);
30
31        //輸出結果:台北台南
32        foreach (XmlNode item in nodelist)
33        {
34            Response.Write(item.Attributes[“c1”].Value);
35            Response.Write(“<br/” + “>”);
36        }
37    }
38}
執行結果:
參考網址:

2012年1月9日星期一

C#角度看XML格式讀取

XML以程式語言的角度來看的目的是什麼?就是為了知道怎麼讀寫,怎麼解析內容

讀寫的方式有很多種,XmlReader, XmlDocument……能控制的角度,能使用的函式也有不同
在此先介紹 XmlDocument

先將 XmlDocument 產生物件之後,可呼叫 Load() 來載入 XML 檔,如果用 LoadXml() 則可以由字串來讀入,也就是一個傳入路徑,一個傳入String,之後便透過節點的方式,指定要讀取哪一個階層的節點們,然後用迴圈逐一的將內容讀取出來,以下為簡單的範例程式
               
 XmlDocument XmlDoc = new XmlDocument( );
 XmlDoc.Load( @”C:XmlFileName.XML” );
 XmlNodeList NodeLists = XmlDoc.SelectNodes( “Root/MyLevel1” );

 foreach ( XmlNode OneNode in NodeLists )
 {
     String StrAttrName = OneNode.Attributes.Name; 
     String StrAttrValue = OneNode.Attributes[ ” MyAttr1 ” ].Value;  
     String StrAttrValue = OneNode.InnerText;
  }

如此便可將 <MyLevel1> 這一層的節點都抓出來,下面這個XML範例來抓應該會抓到五個,然後讀取每一個的 MyAttr1 屬性的內容以及Node的InnerText。(備註:但是這樣的作法,是固定的沒有彈性的,必須每個<MyLevel1>節點都要具備MyAttr1,否則就會有Exception,而某個Node如果有多個Attribute則不會讀取到)。同樣的,如果用XmlNodeList NodeLists = XmlDoc.SelectNodes( “Root/MyLevel1/MyLevel2” );就可以讀取這層的四個節點了。 接下來,我們看看XML的格式

<?xml version=”1.0″ encoding=”utf-8″?>
<Root>
   <MyLevel1 MyAttr1 = “aaaaa” > WXYZ 
       <MyLevel2 MyAttr10 = “UUUUUUUUU” />
       <MyLevel2 MyAttr10 = “KKKKKKKKK” >QWER</MyLevel2>
   </MyLevel1>
   <MyLevel1 MyAttr1 = “aaaaa” > WXYZ 
       <MyLevel2 MyAttr10 = “VVVVVVVVV” />
       <MyLevel2 MyAttr10 = “PPPPPPPPP” >QWER</MyLevel2>
   </MyLevel1>
   <MyLevel1 MyAttr1 = “bbbbb” MyAttr2 = “bbbbb”/>
   <MyLevel1 MyAttr1 = “UUUUUUUUU” />
</Root>

Root是根節點,一個檔案只能有一個,接下來,每個<>所括住的都是一個節點,並且分層次存在,層次的分法,是相同的標記如果用<>與</>來分兩行來包住其他的<>節點,那這些被包起來的,就會是下一層。而每個節點可以有Attributes,每個屬性可以存放一個數值(或字串),而如果節點的表示法用 用<>與</>來表示,且中間夾了數值(或字串),則這個稱為InnerText。(備註:另外還有InnerXml,這個是包含子節點都算進去,有點複雜,也可先不理會),所以用程式來讀取其Attributes的Value,或是讀取InnerText,在轉成需要的格式,就是XML的讀取應用方式了,

接下來,挑戰一下有難度的格式吧!!




<?xml version=”1.0″ encoding=”utf-8″?>
<Root>
   <MyLevel1 MyAttr1 = “aaaaa” > WXYZ 
       <MyLevel2 MyAttr100 = “第二層01” />
       <MyLevel2>IN_002</MyLevel2>
   </MyLevel1>
   <MyLevel1 MyAttr1 = “bbbbb” > WXYZ 
       <MyLevel2 MyAttr100 = “第二層02” MyAttr101 = “第二層002” />
       <MyLevel2>IN_003</MyLevel2>
   </MyLevel1>
   <MyLevel1 MyAttr1 = “ccccc” > WXYZ 
       <MyLevel3 MyAttr100 = “第二層03” />
       <MyLevel3>IN_004</MyLevel3>
   </MyLevel1>
   <MyLevel1 MyAttr1 = “ddddd” > WXYZ 
       <MyLevel2 MyAttr100 = “第二層04” />
       <MyLevel2>IN_005</MyLevel2>
   </MyLevel1>
   <YouLevel1 MyAttr1 = “ddddd” > WXYZ 
       <MyLevel2 MyAttr100 = “第二層05” />
       <MyLevel2>IN_006</MyLevel2>
   </YouLevel1>
   <MyLevel1 MyAttr1 = “bbbbb” MyAttr2 = “bbbbb”/>
   <MyLevel1 MyAttr10 = “UUUUUUUUU” />
   <MyLevel1>IN_007</MyLevel1>
</Root>

不管他格式多複雜,用以下的方式,就可以讀取節點的每個Attribute,以及InnerText了,且,不會去嘗試讀取不存在的Attribute,所以不會發生Exception。

foreach ( XmlNode OneNode in NodeLists )
{
String StrNodeName = OneNode.Name.ToString();
foreach ( XmlAttribute Attr in OneNode.Attributes )
{
String StrAttr = Attr.Name.ToString( );
String StrValue = OneNode.Attributes[ Attr.Name.ToString( ) ].Value;
String StrInnerText = OneNode.InnerText;
}
}

再來,就是怎麼選擇要讀取哪一層,如果用以下的方式會讀取在Root底下的MyLevel1底下的MyLevel2,對,MyLevel3就不會被讀取了。還有YouLevel1底下的MyLevel2也不會被讀取,
所以會讀取到6個節點。
XmlNodeList NodeLists = XmlDoc.SelectNodes( “Root/MyLevel1/MyLevel2” ); 

如果用以下的方式會讀取在Root底下的MyLevel1 ,則會讀取到7個節點
XmlNodeList NodeLists = XmlDoc.SelectNodes( “Root/MyLevel1” ); 

http://social.msdn.microsoft.com/Forums/zh-TW/98e62a57-8715-43e5-8308-5c990ddb9afb/xml?forum=233
using System.Xml;
using System.IO;
….
string strXML = “<ROWDATA><IDX>57981</IDX><MACHINE_TYPE>2</MACHINE_TYPE><PARAM_TYPE>3</PARAM_TYPE><IS_CONTROL>1</IS_CONTROL><RATIO>1.00</RATIO><EXTRA_CTRL>0</EXTRA_CTRL></ROWDATA>”;
StringReader sr = new StringReader(strXML);
DataSet ds = new DataSet();
ds.ReadXml(sr);
MessageBox.Show(ds.Tables[0].Rows[0][0].ToString());       //IDX
MessageBox.Show(ds.Tables[0].Rows[0][1].ToString());       //Machine Type
XmlDocument doc = new XmlDocument();
            doc.LoadXml(“<ROWDATA> <IDX>57981</IDX><MACHINE_TYPE>2</MACHINE_TYPE><PARAM_TYPE>3</PARAM_TYPE><IS_CONTROL>1</IS_CONTROL><RATIO>1.00</RATIO><EXTRA_CTRL>0</EXTRA_CTRL></ROWDATA>”);
            foreach (XmlNode node in doc.DocumentElement.ChildNodes)
            {
                if (node.Name == “IDX”)
                MessageBox.Show(node.InnerText);
            }
string xmlString = @"<ROWDATA> <IDX>57981</IDX><MACHINE_TYPE>2</MACHINE_TYPE><PARAM_TYPE>3</PARAM_TYPE><IS_CONTROL>1</IS_CONTROL><RATIO>1.00</RATIO><EXTRA_CTRL>0</EXTRA_CTRL></ROWDATA>";
StringReader sr = new StringReader(xmlString);
XDocument xd = XDocument.Load(sr);
 
var linq = from xml in xd.Descendants("ROWDATA")
           select xml.Element("IDX").Value;
 
foreach(var result in linq)
{
    MessageBox.Show(result);
}

查詢 XML 樹狀結構

Visual Studio 2013
本主題尚未接受評分 – 為這個主題評分
本節提供 LINQ to XML 查詢的範例。
如需有關撰寫 LINQ 查詢的詳細資訊,請參閱 Getting Started with LINQ
具現化 XML 樹狀結構後,撰寫查詢是從樹狀結構擷取資料最有效的方式。 同時,結合功能結構的查詢可讓您從原始文件產生具有不同組織結構的新 XML 文件。

主題
描述
提供查詢 XML 樹狀結構的常見範例。
提供從 XML 樹狀結構規劃與轉換 XML 樹狀結構的常見範例。
提供適用於更進階案例的查詢技術。
顯示數個 XPath 運算式及其 LINQ to XML 對等用法。
顯示以功能性程式設計方式撰寫查詢的小型教學課程。
未經允許不得轉載:GoMCU » C# XML操作 代碼大全(讀XML,寫XML,更新,刪除節點,與dataset結合等)第1/2頁