目的:为了能在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