如何在ASP.NET MVC中读取XML文件的子节点并封装数据?
如何在ASP.NET MVC中读取XML文件的子节点?
首先看一下你的XML结构,根节点<Title>包含month和year属性,下面嵌套了多个<film>节点,每个<film>有day属性和<morning>、<night>子节点。你之前用DataSet.ReadXml的方式没正确获取到子节点内容,是因为DataSet会为XML的每个层级生成单独的DataTable,而你只访问了根节点对应的表,没关联子节点的表。下面给你两种可行的解决方案:
方案一:使用DataSet关联父子表
1. 定义正确的模型类
首先调整你的模型,让它能容纳所有需要的字段:
public class FilmItem { public int Month { get; set; } public int Year { get; set; } public int Day { get; set; } public string Morning { get; set; } public string Night { get; set; } }
2. 修正控制器中的ReturnData方法
需要注意文件路径的问题,直接写文件名可能找不到文件,要用Server.MapPath获取物理路径;同时要关联DataSet中自动生成的Title表和film表:
public class FilmController : Controller { public ActionResult DisplayXML() { var data = ReturnData(); return View(data); } private List<FilmItem> ReturnData() { // 假设XML文件放在App_Data文件夹下,调整路径到你的实际位置 string xmlFilePath = Server.MapPath("~/App_Data/myxmldata.xml"); DataSet ds = new DataSet(); ds.ReadXml(xmlFilePath); // 获取根节点Title的属性 var titleRow = ds.Tables["Title"].AsEnumerable().FirstOrDefault(); if (titleRow == null) return new List<FilmItem>(); int month = Convert.ToInt32(titleRow["month"]); int year = Convert.ToInt32(titleRow["year"]); // 从film表中读取子节点数据,并关联Title的属性 var filmList = from filmRow in ds.Tables["film"].AsEnumerable() select new FilmItem { Month = month, Year = year, Day = Convert.ToInt32(filmRow["day"]), Morning = filmRow["morning"].ToString().Trim(), Night = filmRow["night"].ToString().Trim() }; return filmList.ToList(); } }
3. 编写对应的View
创建DisplayXML.cshtml视图,展示读取到的数据:
@model List<FilmItem> <h2>电影排期表</h2> <table border="1" cellpadding="8"> <tr> <th>月份</th> <th>年份</th> <th>日期</th> <th>上午影片</th> <th>晚上影片</th> </tr> @foreach (var item in Model) { <tr> <td>@item.Month</td> <td>@item.Year</td> <td>@item.Day</td> <td>@item.Morning</td> <td>@item.Night</td> </tr> } </table>
方案二:使用LINQ to XML(更简洁直观)
如果你的XML结构不复杂,LINQ to XML是更直接的方式,不需要处理DataSet的表关系:
1. 模型类和上面一致
还是用FilmItem类即可。
2. 重写ReturnData方法
private List<FilmItem> ReturnDataUsingLinqToXml() { string xmlFilePath = Server.MapPath("~/App_Data/myxmldata.xml"); XDocument xmlDoc = XDocument.Load(xmlFilePath); var titleElement = xmlDoc.Root; if (titleElement == null) return new List<FilmItem>(); // 读取Title节点的属性 int month = int.Parse(titleElement.Attribute("month").Value); int year = int.Parse(titleElement.Attribute("year").Value); // 遍历所有film子节点,读取数据 var filmList = from filmElement in titleElement.Elements("film") select new FilmItem { Month = month, Year = year, Day = int.Parse(filmElement.Attribute("day").Value), Morning = filmElement.Element("morning").Value.Trim(), Night = filmElement.Element("night").Value.Trim() }; return filmList.ToList(); }
然后在DisplayXML方法里调用这个新的方法就行,视图和方案一的完全一样。
两种方式都能正确读取到XML的子节点内容,LINQ to XML代码更简洁,适合结构简单的XML;DataSet方式则更适合复杂的、有多层嵌套或需要数据绑定的场景。
内容的提问来源于stack exchange,提问作者Sergen Siyli
相关产品推荐
相关产品推荐

