C#中讀取XML文件的四種常用方法
XML
簡(jiǎn)介
Xml是Internet環(huán)境中跨平臺(tái)的,依賴于內(nèi)容的技術(shù),是當(dāng)前處理結(jié)構(gòu)化文檔信息的有力工具。XML是一種簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)語(yǔ)言,使用一系列簡(jiǎn)單的標(biāo)記描述數(shù)據(jù),而這些標(biāo)記可以用方便的方式建立,雖然XML占用的空間比二進(jìn)制數(shù)據(jù)要占用更多的空間,但XML極其簡(jiǎn)單易于掌握和使用。
格式
實(shí)例:
文件名:test.xml
<?xml version="1.0" encoding="UTF-8"?>
<notes>
<note Type="1">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<note Type="2">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</notes>
c#讀取XML文件方法
使用XmlDocument
使用XmlDocument是一種基于文檔結(jié)構(gòu)模型的方式來(lái)讀取XML文件.在XML文件中,我們可以把XML看作是由文檔聲明(Declare),元素(Element),屬性(Attribute),文本(Text)等構(gòu)成的一個(gè)樹.最開始的一個(gè)結(jié)點(diǎn)叫作根結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)都可以有自己的子結(jié)點(diǎn).得到一個(gè)結(jié)點(diǎn)后,可以通過(guò)一系列屬性或方法得到這個(gè)結(jié)點(diǎn)的值或其它的一些屬性.例如:
- xn 代表一個(gè)結(jié)點(diǎn)
- xn.Name;//這個(gè)結(jié)點(diǎn)的名稱
- xn.Value;//這個(gè)結(jié)點(diǎn)的值
- xn.ChildNodes;//這個(gè)結(jié)點(diǎn)的所有子結(jié)點(diǎn)
- xn.ParentNode;//這個(gè)結(jié)點(diǎn)的父結(jié)點(diǎn)
- .......
操作
//聲明XmlDocument對(duì)象,并加載XML文件
XmlDocument doc = new XmlDocument();
doc.Load(@"test.xml"); //此處為XML文件的路徑
#region 獲取節(jié)點(diǎn)
//得到根節(jié)點(diǎn)node
XmlNode xn = doc.SelectSingleNode("notes");
//得到根節(jié)點(diǎn)的所有子節(jié)點(diǎn)
XmlNodeList xnl = xn.ChildNodes;
foreach (XmlNode xNode in xnl)
{
//將節(jié)點(diǎn)轉(zhuǎn)換為元素,便于得到節(jié)點(diǎn)的屬性值
XmlElement xe = (XmlElement)xNode;
//得到note節(jié)點(diǎn)的屬性值
string noteType = xe.GetAttribute("Type").ToString();
//得到note節(jié)點(diǎn)的所有子節(jié)點(diǎn)
XmlNodeList xnl0 = xe.ChildNodes;
string body = xnl0.Item(3).InnerText;
//修改節(jié)點(diǎn)值
xnl0.Item(0).InnerText = "Tovv";
}
#endregion
#region 增加節(jié)點(diǎn) -- 以下是追加
//創(chuàng)建一個(gè)節(jié)點(diǎn),并設(shè)置節(jié)點(diǎn)的屬性
XmlElement xelKey = doc.createElement_x("note");
XmlAttribute xelType = doc.CreateAttribute("Type");
xelType.InnerText = "3";
xelKey.SetAttributeNode(xelType);
//創(chuàng)建子節(jié)點(diǎn)
XmlElement xelAuthor = doc.createElement_x("to");
xelAuthor.InnerText = "Tang";
xelKey.AppendChild(xelAuthor);
//note,并保存整個(gè)文件
xn.AppendChild(xelKey);
doc.Save(@"..\..\Book.xml");
#endregion
#region 增加節(jié)點(diǎn) -- 以下是覆蓋
XmlDocument doc = new XmlDocument();
doc.LoadXml("<notes></notes>");//用這句話,會(huì)把以前的數(shù)據(jù)全部覆蓋掉,只有你增加的數(shù)據(jù)
#endregion
#region 刪除節(jié)點(diǎn)
XmlElement xe = xmlDoc.DocumentElement;
string strPath = string.Format("/notes/notes[@Type=\"{0}\"]", dgvBookInfo.CurrentRow.Cells[1].Value.ToString());
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根據(jù)XPath表達(dá)式,獲得符合條件的第一個(gè)節(jié)點(diǎn).
selectXe.ParentNode.RemoveChild(selectXe); //移除節(jié)點(diǎn)
#endregion注意
當(dāng)XML文件中含有注釋時(shí),則會(huì)出錯(cuò),因?yàn)樽⑨屢彩且环N結(jié)點(diǎn)類型,在沒有特別說(shuō)明的情況下,會(huì)默認(rèn)它也是一個(gè)結(jié)點(diǎn)(Node).所以在把結(jié)點(diǎn)轉(zhuǎn)換成元素的時(shí)候就會(huì)報(bào)錯(cuò).“無(wú)法將類型為“System.Xml.XmlComment”的對(duì)象強(qiáng)制轉(zhuǎn)換為類型“System.Xml.XmlElement”。”
解決方法:
XmlDocument xmlDoc = new XmlDocument(); XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true;//忽略文檔里面的注釋 XmlReader reader = XmlReader.Create(@"..\..\Book.xml", settings); xmlDoc.Load(reader); //最后讀取完畢后,記得要關(guān)掉reader reader.Close();
使用XmlTextReader/XmlTextWriter
使用XmlTextReader讀取數(shù)據(jù)的時(shí)候,首先創(chuàng)建一個(gè)流,然后用read()方法來(lái)不斷的向下讀,根據(jù)讀取的結(jié)點(diǎn)的類型來(lái)進(jìn)行相應(yīng)的操作.
操作
//使用XmlTextReader讀文件
XmlTextReader reader = new XmlTextREADER(@"test.xml");
while(reader.Read())
{
if(reader.NodeType == XmlNodeType.Element)
{
//讀取節(jié)點(diǎn)屬性
if(reader.Name == "note")
{
//第一種方法
string nodeType = reader.GetAttribute(0);
//另一種方法
for(int i = 0; i < reader.AttributeCount; i++)
{
reader.MoveToAttribute(i);
string str = "屬性:" + reader.Name + "=" + reader.Value;
}
}
//讀取節(jié)點(diǎn)的值
if(reader.Name == "to")
{
string nodeTo = reader.ReadElementString().Trim();
}
if(reader.Name == "from")
{
string nodeFrom = reader.ReadElementString().Trim();
}
//當(dāng)節(jié)點(diǎn)類型為尾節(jié)點(diǎn)時(shí)
if(reader.NodeType == XmlNodeType.EndElement)
{
}
}
}
reader.Close(); //關(guān)閉讀文件流
//使用XmlTextWriter寫文件
//XmlTextWriter寫文件的時(shí)候,默認(rèn)是覆蓋以前的文件,如果此文件名不存在,它將創(chuàng)建此文件
XmlTextWriter myXmlTextWriter = new XmlTextWriter(@"test.xml", null);
//使用 Formatting 屬性指定希望將 XML 設(shè)定為何種格式。 這樣,子元素就可以通過(guò)使用 Indentation 和 IndentChar 屬性來(lái)縮進(jìn)。
myXmlTextWriter.Formatting = Formatting.Indented;
myXmlTextWriter.WriteStartDocument(false);
myXmlTextWriter.WriteStartElement("notes"); //寫入notes的起始節(jié)點(diǎn)
myXmlTextWriter.WriteComment("note information"); //寫入注釋
myXmlTextWriter.WriteStartElement("note"); //寫入note的起始節(jié)點(diǎn)
myXmlTextWriter.WriteAttributeString("Type", "3"); //寫入note節(jié)點(diǎn)的屬性
myXmlTextWriter.WriteElementString("to","hong"); //寫入note子節(jié)點(diǎn)
myXmlTextWriter.WriteEndElement(); //寫入note的尾節(jié)點(diǎn)
myXmlTextWriter.WriteEndElement(); //寫入notes的尾節(jié)點(diǎn)
myXmlTextWriter.Flush(); //結(jié)束寫入
myXmlTextWriter.Close(); //關(guān)閉寫入流
使用Linq to Xml
Linq是C#3.0中出現(xiàn)的一個(gè)新特性,使用它可以方便的操作許多數(shù)據(jù)源,也包括XML文件.使用Linq操作XML文件非常的方便,而且也比較簡(jiǎn)單
操作
XElement xe = XElement.Load(@"test.xml");
#region 讀取數(shù)據(jù)
IEnumerable<XElement> elements = from ele in xe.Elements("note") select ele;
foreach(var ele in elements)
{
//獲取節(jié)點(diǎn)的屬性
string nodeType = ele.Attribute("Type").Value;
//獲取節(jié)點(diǎn)的子節(jié)點(diǎn)值
string nodeTo = ele.Element("to").Value;
}
#endregion
#region 插入數(shù)據(jù)
XElement record = new XElement(
new XElement("note",
new XAttribute("Type", "3"),
new XElement("to", "tang"),
new XElmeent("from", "hong")
)
);
xe.Add(record);
xe.Save(@"test.xml");
#endregion
#region 刪除數(shù)據(jù)
//刪除選中的數(shù)據(jù)
IEnumerable<XElement> elements = from ele in xe.Elements("note")
where (string)ele.Attribute("Type") == 1
select ele;
if(elements.Count() > 0)
elements.First().Remove();
xe.Save(@"test.xml");
//刪除所有的數(shù)據(jù)
IEnumerable<XElement> elements = from ele in xe.Elements("note") select ele;
if(elements.Count() > 0)
elements.Remove();
xe.Save(@"test.xml");
#endregion
#region 修改數(shù)據(jù)
IEnumerable<XElement> elements = from ele in xe.Elements("note")
where (string)ele.Attribute("Type") == 1
select ele;
if(elements.Count() > 0)
{
XElement first = elements.First();
//設(shè)置新的屬性
first.SetAttributeValue("Type", 5);
//替換新的節(jié)點(diǎn)
first.ReplaceNodes(
new XElement("to", "tangtang"),
new XElmeent("from", "hong")
);
}
xe.Save(@"test.xml");
#endregion
使用DataSet
ADO.NET對(duì)XML提供了強(qiáng)大的支持,其主要事通過(guò)數(shù)據(jù)集與XML進(jìn)行交互。
操作
DataSet ds = new DataSet(); //讀取文件 ds.ReadXml(@"test.xml"); //顯示數(shù)據(jù) string nodeTo = ds.Tables[0].Rows[0]["to"]; //修改數(shù)據(jù) ds.Talbes[0].Rows[0]["to"] = "tos"; //插入數(shù)據(jù) DataRow dr = ds.Tables[0].NewRow(); dr["to"] = "dsds"; dr["from"] = "wang"; ds.Tables[0].Rows.Add(dr); //刪除數(shù)據(jù) DataRow delR = ds.Tables[0].Rows[0]; ds.Tables[0].Rows.Remove(delR); //保存數(shù)據(jù) ds.WriteXml(@"test.xml");
到此這篇關(guān)于C#中讀取XML文件的四種常用方法的文章就介紹到這了,更多相關(guān)C#讀取XML內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)統(tǒng)計(jì)100以內(nèi)所有素?cái)?shù)的個(gè)數(shù)
這篇文章介紹了C#實(shí)現(xiàn)統(tǒng)計(jì)100以內(nèi)所有素?cái)?shù)個(gè)數(shù)的方法,文中注釋非常詳細(xì),很適合新手學(xué)習(xí)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11
C#四舍五入MidpointRounding.AwayFromZero解析
這篇文章主要介紹了C#四舍五入MidpointRounding.AwayFromZero,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
C# 獲取動(dòng)態(tài)key的json對(duì)象的值案例
這篇文章主要介紹了C# 獲取動(dòng)態(tài)key的json對(duì)象的值案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
windows下C#定時(shí)管理器框架Task.MainForm詳解
這篇文章主要為大家詳細(xì)介紹了windows下C#定時(shí)管理器框架Task.MainForm的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

