You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:16:50