C#對Xml的檔案操作
目的:為了能在Api傳值的Xml檔案進行操作
結果:自行重複網路部落格的 操作
程式碼:(對場景進行模擬和提前了方法,用了兩種型別的方法操作1.直接藉助C#包進行操作2.利用簡介的Linq操作,當然還有一種方法XmlTextReader和XmlTextWriter(沒有進行測試))
class Program
{
static void Main(string[] args)
{
//公共變數
//賦值的類
BookModel bookModel = new BookModel();
bookModel.BookType = "必修課";
bookModel.BookISBN = "4522-525-1-1";
bookModel.BookAuthor = "wei";
bookModel.BookName = "大學1";
bookModel.BookPrice = 21.55;
//指定節點屬性的位置
string findIdName = "/bookstore/book[@ISBN=\"7-111-19149-2555\"]";
string ISBN = "7-111-19149-2555";
//xml檔案路徑
string url = @"..\..\Book.xml";
//定義檔案
XElement doc = XElement.Load(url);//檔案路徑
/*********************************以下為方法,建議單獨註釋測試*****************************************/
/*
//輸出指定的值,讀取xml檔案轉化為類
var bookModelList = GetXml(url);
Console.WriteLine(bookModelList[0].BookAuthor.ToString());
Console.ReadKey();
//新增Xml,list類分成一個一個類新增
foreach (BookModel xml in bookModelList)
{
//追加資料
AddXml(url, xml);
}
//覆蓋資料,只留下新增的資料 和主節點
Modify(url, bookModel);
//指定某節點中屬性的唯一碼,去刪除整個節點
DeleteXml(url, findIdName);
//修改節點
//修改某 條資料的話,首先也是用Xpath表示式找到所需要修改的那一個結點,然後如果是元素的話,就直接對這個元素賦值,如果是屬性的話,就用SetAttribute方法設定即可.如下:
XiuGai(bookModel, findIdName, url);
*/
/*****************************************以下為Linq方法**********************************/
/*
//查詢一
IEnumerable<XElement> partNos = from c in doc.Descendants("book") select c; //有點像查詢語句,沒有資料的
var get = showInfoByElements(partNos);
//查詢二
// 3.1讀取所有的資料
//直接找到元素為book的這個結點,然後遍歷讀取所有的結果.
IEnumerable<XElement> elements = from ele in doc.Elements("book") select ele;
var gettwo = showInfoByElements(elements);
//插入資料
XElement record = new XElement(new XElement("book",new XAttribute("Type", "選修課"),new XAttribute("ISBN","7-111-19149-1"), new XElement("title", "計算機作業系統1"),
new XElement("author", "7-111-19149-1"),
new XElement("price", 28.00)));
doc.Add(record); //xml格式
//doc.Add(bookModel);
doc.Save(url);
//刪除
//dgvBookInfo.CurrentRow.Cells[1]對應著ISBN號
IEnumerable<XElement> elements = from ele in doc.Elements("book")
where (string)ele.Attribute("ISBN") == ISBN
select ele;
if (elements.Count() > 0)
elements.First().Remove();
doc.Save(url);
//刪除所有
// IEnumerable<XElement> del = from ele in doc.Elements("book") select ele;
IEnumerable<XElement> del = from ele in doc.Elements("book")
select ele;
if (del.Count() > 0)
{
del.Remove();
}
doc.Save(url);
*/
///修改
/// //dgvBookInfo.CurrentRow.Cells[1]對應著ISBN號
IEnumerable<XElement> element = from ele in doc.Elements("book")
where ele.Attribute("ISBN").Value == ISBN
select ele;
//判斷是否有資料
if (element.Count() > 0)
{
//獲取查詢的語句
XElement first = element.First();
///設定新的屬性
first.SetAttributeValue("Type",bookModel.BookType);
///替換新的節點
first.ReplaceNodes(
new XElement("title", bookModel.BookName),
new XElement("author",bookModel.BookAuthor),
new XElement("price", bookModel.BookPrice)
);
doc.Save(@"..\..\Book.xml");
}
}
//使用Linq to XML.
//Linq是C#3.0中出現的一個新特性,使用它可以方便的操作許多資料來源,也包括XML檔案.使用Linq操作XML檔案非常的方便,而且也比較簡單.下面直接看程式碼,
//先定義 一個方法顯示查詢出來的資料
/// <summary>
/// 查詢
/// </summary>
/// <param name="elements">查詢語句</param>
/// <returns></returns>
public static List<BookModel> showInfoByElements(IEnumerable<XElement> elements)
{
List<BookModel> modelList = new List<BookModel>();
foreach (var ele in elements)
{
BookModel model = new BookModel();
model.BookAuthor = ele.Element("author").Value;
model.BookName = ele.Element("title").Value;
model.BookPrice = Convert.ToDouble(ele.Element("price").Value);
model.BookISBN=ele.Attribute("ISBN").Value;
model.BookType=ele.Attribute("Type").Value;
modelList.Add(model);
}
return modelList;
}
/// <summary>
/// 修改某個節點
/// </summary>
/// <param name="bookModel">類的資料</param>
/// <param name="findIdName">節點的屬性值</param>
/// <param name="url">檔案路徑</param>
private static void XiuGai(BookModel bookModel, string findIdName, string url)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(url);
XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 獲取xml文件物件的根XmlElement.
string strPath = string.Format(findIdName);
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根據XPath表示式,獲得符合條件的第一個節點.
selectXe.SetAttribute("Type", bookModel.BookType);//也可以通過SetAttribute來增加一個屬性
selectXe.GetElementsByTagName("title").Item(0).InnerText = bookModel.BookName;
selectXe.GetElementsByTagName("author").Item(0).InnerText = bookModel.BookAuthor;
selectXe.GetElementsByTagName("price").Item(0).InnerText = bookModel.BookPrice.ToString();
xmlDoc.Save(url);
}
/// <summary>
/// 刪除指定節點中指定屬性的資料
/// </summary>
/// <param name="url">xml檔案路徑</param>
/// <param name="findIdName">尋找指定屬性的地址</param>
private static void DeleteXml(string url,string findIdName)
{
//想要刪除某一個結點,直接找到其父結點,然後呼叫RemoveChild方法即可,現在關鍵的問題是如何找到這個結點,上面的SelectSingleNode可以傳入一個Xpath表,我們通過書的ISBN號來找到這本書所在的結點.如下:
XmlDocument doc = new XmlDocument();
doc.Load(url);
XmlElement xe = doc.DocumentElement; // DocumentElement 獲取xml文件物件的根XmlElement.
string strPath = string.Format(findIdName);
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根據XPath表示式,獲得符合條件的第一個節點.
selectXe.ParentNode.RemoveChild(selectXe);
doc.Save(url);
}
/// <summary>
/// 覆蓋修改
/// </summary>
/// <param name="url"></param>
/// <param name="bookModel"></param>
private static void Modify(string url, BookModel bookModel)
{
//載入檔案並選出要結點:
XmlDocument doc = new XmlDocument();
doc.Load(url);
// XmlNode root = doc.SelectSingleNode("bookstore");
//建立一個結點,並設定結點的屬性:
XmlElement xelKey = doc.CreateElement("book");
XmlAttribute Type = doc.CreateAttribute("Type");
Type.InnerText = bookModel.BookType;
xelKey.SetAttributeNode(Type); //新增節點book屬性 Type="adfdsf"
XmlAttribute ISBN = doc.CreateAttribute("ISBN");
ISBN.InnerText = bookModel.BookISBN;
xelKey.SetAttributeNode(ISBN); //新增節點book屬性 ISBN="7-111-19149-1"
// 建立子結點:
XmlElement title = doc.CreateElement("title");//賦值的節點
title.InnerText = bookModel.BookName;//賦值內容
xelKey.AppendChild(title);
XmlElement author = doc.CreateElement("author");//賦值的節點
author.InnerText = bookModel.BookAuthor;//賦值內容
xelKey.AppendChild(author);
XmlElement price = doc.CreateElement("price");//賦值的節點
price.InnerText = bookModel.BookPrice.ToString();//賦值內容
xelKey.AppendChild(price);
//最後把book結點掛接在要結點上,並儲存整個檔案:AppendChild插入的意思
XmlElement root = doc.CreateElement("bookstore");
root.AppendChild(xelKey);
//用上面的方法,是向已有的檔案上追加資料,如果想覆蓋原有的所有資料,可以更改一下,使用LoadXml方法:
doc.LoadXml("<bookstore>"+root.InnerXml+"</bookstore>");//用這句話,會把以前的資料全部覆蓋掉,只有你增加的資料
doc.Save(url);
}
/// <summary>
/// 類新增到xml檔案中
/// </summary>
/// <param name="url">檔案路徑</param>
/// <param name="bookModel">有資料的類</param>
private static void AddXml(string url, BookModel bookModel)
{
//載入檔案並選出要結點:
XmlDocument doc = new XmlDocument();
doc.Load(url);
XmlNode root = doc.SelectSingleNode("bookstore");
//建立一個結點,並設定結點的屬性:
XmlElement xelKey = doc.CreateElement("book");
XmlAttribute Type = doc.CreateAttribute("Type");
Type.InnerText = bookModel.BookType;
xelKey.SetAttributeNode(Type); //新增節點book屬性 Type="adfdsf"
XmlAttribute ISBN = doc.CreateAttribute("ISBN");
ISBN.InnerText = bookModel.BookISBN;
xelKey.SetAttributeNode(ISBN); //新增節點book屬性 ISBN="7-111-19149-1"
// 建立子結點:
XmlElement title = doc.CreateElement("title");//賦值的節點
title.InnerText = bookModel.BookName;//賦值內容
xelKey.AppendChild(title);
XmlElement author = doc.CreateElement("author");//賦值的節點
author.InnerText = bookModel.BookAuthor;//賦值內容
xelKey.AppendChild(author);
XmlElement price = doc.CreateElement("price");//賦值的節點
price.InnerText = bookModel.BookPrice.ToString();//賦值內容
xelKey.AppendChild(price);
//最後把book結點掛接在要結點上,並儲存整個檔案:拼接節點
root.AppendChild(xelKey);
doc.Save(url);
}
/// <summary>
/// 解析Xml
/// </summary>
/// <param name="url">檔案路徑</param>
/// <returns>list類</returns>
private static List<BookModel> GetXml(string url)
{
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;//忽略文件裡面的註釋
XmlReader reader = XmlReader.Create(url, settings);
xmlDoc.Load(reader);
reader.Close();
// 得到根節點bookstore
XmlNode xn = xmlDoc.SelectSingleNode("bookstore");
// 得到根節點的所有子節點
XmlNodeList xnl = xn.ChildNodes;
List<BookModel> ListBookModel = new List<BookModel>();
foreach (XmlNode xn1 in xnl)
{
BookModel bookModel = new BookModel();
// 將節點轉換為元素,便於得到節點的屬性值
XmlElement xe = (XmlElement)xn1;
// 得到Type和ISBN兩個屬性的屬性值
bookModel.BookISBN = xe.GetAttribute("ISBN").ToString();
bookModel.BookType = xe.GetAttribute("Type").ToString();
// 得到Book節點的所有子節點,並賦值到類裡面
XmlNodeList xnl0 = xe.ChildNodes;
bookModel.BookName = xnl0.Item(0).InnerText;
bookModel.BookAuthor = xnl0.Item(1).InnerText;
bookModel.BookPrice = Convert.ToDouble(xnl0.Item(2).InnerText);
ListBookModel.Add(bookModel);
}
return ListBookModel;
}
}
以上與原文有區別,主要是對方法進行提取出來了,直接呼叫。
轉載自:https://www.cnblogs.com/wt627939556/p/6646752.html http://www.cnblogs.com/a1656344531/archive/2012/11/28/2792863.html
本測試程式原始碼:VS工具:https://download.csdn.net/download/weixin_42401291/10799967
qq聯絡:1174787689