Linq to XML操作XML文件

时间:2021-01-06 13:24:59

LINQ的类型

在MSDN官方文件中,LINQ分为几种类型:

LINQ to Objects(或称LINQ to Collection),这是LINQ的基本功能,针对集合对象进行查询处理,包括基本的汇总与过滤都在这个功能内实现。

LINQ to SQL,这是LINQ功能的SQL Server数据库版本,通过LINQ指令,可以直接查询SQL Server数据库,而完全无须编写SQL指令,这个功能在推出初期受到了相当大的关注,目前这个功能已经融入EF内。

LINQ to XML,是针对XML设计的LINQ功能,它通过XDocument与XElement两个主要类的功能,进行LINQ语法解析与XML内的元素的查询操作。可用来替代现有以XPath方式解析XML文件的功能。

LINQ to DataSet(或称LINQ to ADO.NET),是为现有以DataSet或DataTable对象开发应用程序提供支持LINQ操作的功能,以AsEnumerate()为基础,将DataSet与DataTable内的数据转换成IEnumerable接口的集合对象,即可直接使用LINQ to Objects的方式查询。

什么是LINQ to XML?

LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML。

LINQ to XML 将 XML 文档置于内存中,这一点很像文档对象模型 (DOM)。您可以查询和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然后通过 Internet 发送。但是,LINQ to XML 与 DOM 不同:它提供一种新的对象模型,这是一种更轻量的模型,使用也更方便,这种模型利用了 Visual C# 2008 在语言方面的改进。

LINQ to XML 最重要的优势是它与 语言集成查询 (LINQ) 的集成。由于实现了这一集成,因此,可以对内存 XML 文档编写查询,以检索元素和属性的集合。LINQ to XML 的查询功能在功能上(尽管不是在语法上)与 XPath 和 XQuery 具有可比性。Visual C# 2008 集成 LINQ 后,可提供更强的类型化功能、编译时检查和改进的调试器支持。

LINQ to XML 的另一个优势是通过将查询结果用作 XElementXAttribute 对象构造函数的参数,实现了一种功能强大的创建 XML 树的方法。这种方法称为“函数构造”,利用这种方法,开发人员可以方便地将 XML 树从一种形状转换为另一种形状。

下面是对于XML文件的相关操作。。。。。。

1、导出XML

        /// <summary>
/// 导出XML
/// </summary>
/// <returns></returns>
public ActionResult ReportXml()
{
try
{
#if DEBUG
List<UserInfo> user = new List<UserInfo>()
{
new UserInfo(){UserId="",UserName="张三",UserSex="男",UserAge=},
new UserInfo(){UserId="",UserName="李四",UserSex="男",UserAge=},
new UserInfo(){UserId="",UserName="王五",UserSex="男",UserAge=},
new UserInfo(){UserId="",UserName="赵六",UserSex="女",UserAge=},
};
#endif
XmlTextWriter myXml = new XmlTextWriter(@"C:\User.xml", null);
// 设置缩进
myXml.Formatting = Formatting.Indented;
// 编写版本为“1.0”并具有独立特性的 XML 声明。
myXml.WriteStartDocument(false);
myXml.WriteStartElement("UserInfo");
// 注释
myXml.WriteComment("记录用户的信息");
foreach (var item in user)
{
myXml.WriteStartElement("User");
myXml.WriteAttributeString("UserId", item.UserId.ToString());
myXml.WriteElementString("UserName", item.UserName);
myXml.WriteElementString("UserSex", item.UserSex);
myXml.WriteElementString("UserAge", item.UserAge.ToString());
myXml.WriteEndElement();
}
myXml.Flush();
myXml.Close();
return Json(new { msg = "导出成功" }, JsonRequestBehavior.AllowGet);
}
catch (Exception)
{
return Json(new { msg = "导出失败" }, JsonRequestBehavior.AllowGet);
} }

2、读取XML

        /// <summary>
/// 读取XML
/// </summary>
/// <returns></returns>
public ActionResult ReadXml()
{
List<UserInfo> list = new List<UserInfo>();
XElement xe = XElement.Load(@"C:\User.xml");
IEnumerable<XElement> elements = from p in xe.Elements("User") select p;
foreach (var item in elements)
{
UserInfo user = new UserInfo();
user.UserId = item.Attribute("UserId").Value;
user.UserName = item.Element("UserName").Value;
user.UserSex = item.Element("UserSex").Value;
user.UserAge = int.Parse(item.Element("UserAge").Value);
list.Add(user);
}
return Json(list.ToList(), JsonRequestBehavior.AllowGet);
}

3、删除一条XML数据

        /// <summary>
/// 删除XML
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public ActionResult DeleteXML(string userId)
{
try
{
XElement xe = XElement.Load(@"C:\User.xml");
IEnumerable<XElement> elements = from p in xe.Elements("User")
where p.Attribute("UserId").Value == userId.ToString()
select p;
if (elements.Count() > )
{
elements.Remove();
}
xe.Save(@"C:\User.xml");
return Json(new { flag = true }, JsonRequestBehavior.AllowGet);
}
catch (Exception)
{
return Json(new { flag = false }, JsonRequestBehavior.AllowGet);
} }

4、添加一条XML数据

        /// <summary>
/// 新增XML
/// </summary>
/// <returns></returns>
public ActionResult AddXML()
{
try
{
XElement xe = XElement.Load(@"C:\User.xml");
XElement record = new XElement(
new XElement("User",
new XAttribute("UserId", Guid.NewGuid()),
new XElement("UserName", "张学友"),
new XElement("UserSex", "男"),
new XElement("UserAge", "")
));
xe.Add(record);
xe.Save(@"C:\User.xml");
return Json(new { flag = true }, JsonRequestBehavior.AllowGet);
}
catch (Exception)
{
return Json(new { flag = false }, JsonRequestBehavior.AllowGet);
} }

5、修改一条XML数据

        /// <summary>
/// 编辑XML
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public ActionResult EditXML(string userId)
{
try
{
XElement xe = XElement.Load(@"C:\User.xml");
IEnumerable<XElement> elements = from p in xe.Elements("User")
where p.Attribute("UserId").Value == userId.ToString()
select p;
if (elements.Count() > )
{
XElement model = elements.FirstOrDefault();
// 设置新属性
model.SetAttributeValue("UserId", userId);
// 更新新节点
model.ReplaceNodes
(
new XElement("UserName", "周杰伦"),
new XElement("UserSex", "男"),
new XElement("UserAge", )
);
}
xe.Save(@"C:\User.xml");
return Json(new { flag = true }, JsonRequestBehavior.AllowGet);
}
catch (Exception)
{
return Json(new { flag = false }, JsonRequestBehavior.AllowGet);
}
}

6、前台页面代码

@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script src="~/Scripts/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function () {
$("#btnReport").click(function () {
ReportXml();
});
$("#btnRead").click(function () {
ReadXml();
});
$(document).on({
click: function (e) {
DeleteXML($(this).attr("userId"));
}
}, ".btndelete");
$("#btnAdd").click(function () {
AddXML();
});
$(document).on({
click: function (e) {
EditXML($(this).attr("userId"));
}
}, ".btnEdit");
});
// 导出XML
function ReportXml() {
var option =
{
url: '/XML/ReportXml',
type: "post",
success: function (data) {
if (data.msg) {
alert("导出成功!");
}
else {
alert("导出失败!");
}
}
};
$.ajax(option);
}
// 读取XML
function ReadXml() {
var option =
{
url: '/XML/ReadXml',
type: "get",
success: function (data) {
$("#tb_table tr:gt(0)").remove();
var html = "";
$.each(data, function (index, item) {
html += "<tr>";
html += "<td>" + item.UserName + "</td>";
html += "<td>" + item.UserSex + "</td>";
html += "<td>" + item.UserAge + "</td>";
html += "<td><input class='btndelete' type='button' userId='" + item.UserId + "' value='删除'/><input class='btnEdit' type='button' userId='" + item.UserId + "' value='修改'/></td>";
html += "</tr>";
});
$("#tb_table").append(html);
}
};
$.ajax(option);
} // 删除
function DeleteXML(userId) {
if (confirm("确定要删除吗?")) {
var option =
{
url: '/XML/DeleteXML',
type: 'get',
data: { userId: userId },
success: function (data) {
if (data.flag) {
alert("删除成功!");
ReadXml();
}
else {
alert("删除失败!");
}
}
};
$.ajax(option);
} }
// 添加XML
function AddXML() {
var options =
{
url: '/XML/AddXML',
type: 'get',
success: function (data) {
if (data.flag) {
alert("新增成功!");
ReadXml();
}
else {
alert("新增失败!");
}
}
};
$.ajax(options);
}
// 修改XML
function EditXML(userId) {
var options =
{
url: '/XML/EditXML',
type: 'get',
data: { userId: userId },
success: function (data) {
if (data.flag) {
alert("修改成功!");
ReadXml();
}
else {
alert("修改失败!");
}
}
};
$.ajax(options);
}
</script> </head>
<body>
<div>
<input type="button" value="导出XML" id="btnReport" />
<input type="button" value="读取XML" id="btnRead" />
<input type="button" value="添加XML" id="btnAdd" />
</div>
<br /><br />
<table id="tb_table" border="1">
<tr>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td>操作</td>
</tr>
</table>
<br /> </body>
</html>

7、页面效果

Linq to XML操作XML文件

权责申明

作者:SportSky 出处: http://www.cnblogs.com/sportsky/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。