C# 使用StringBuilder将列表转换为HTML表

C# 使用StringBuilder将列表转换为HTML表,c#,asp.net-mvc,foreach,html-table,stringbuilder,C#,Asp.net Mvc,Foreach,Html Table,Stringbuilder,在Stack overflow社区的帮助下,我已经能够从XML文档中获取一些数据,并使用以下代码将其添加到列表中 String URLString = "https://api3.libcal.com/api_hours_grid.php?iid=4246&format=xml&weeks=1&systemTime=0"; XDocument xdoc = new XDocument(); xdoc = XDocument.Load(URLString); va

在Stack overflow社区的帮助下,我已经能够从XML文档中获取一些数据,并使用以下代码将其添加到列表中

String URLString = "https://api3.libcal.com/api_hours_grid.php?iid=4246&format=xml&weeks=1&systemTime=0";
XDocument xdoc = new XDocument();
xdoc = XDocument.Load(URLString);    

var location = (from p in xdoc.Descendants("location")
                from s in p.Descendants("week").Elements()            
                select new
                {

                    CampusName = (string)p.Element("name"),
                    WeekD = (string)s.Element("date"),
                    OpenHours = (string)s.Element("rendered"),
                    Day = s.Name.LocalName

                }).ToList();
这非常有效,我可以使用以下命令输出到无序列表

string currentLocation = "";

foreach (var item in location)
{
    if (item.CampusName != currentLocation)
    {
        <h2>@item.CampusName</h2>
        currentLocation = @item.CampusName;
    }
    <ul>
        <li>@item.WeekD - @item.OpenHours</li>
    </ul>
} 
string currentLocation=“”;
foreach(位置中的var项目)
{
如果(item.CampusName!=当前位置)
{
@item.CampusName
currentLocation=@item.CampusName;
}
  • @item.WeekD-@item.OpenHours
}
然而,在回顾了我的需求之后,我觉得使用HTML表可以更好地显示数据。我尝试了几种不同的方法使用字符串生成器来实现这一点

string dayStop = "Sunday";    
StringBuilder sb = new StringBuilder();
sb.Append("<TABLE>\n");
sb.Append("<TR>\n");
foreach (var item in location)
{

    if (item.Day != dayStop)

    {
        sb.Append("<TH>\n");
        sb.Append(@item.Day);
        sb.Append("</TH>\n");

        //dayStop = @item.Day;
    }

}

sb.Append("</TR>\n");

sb.Append("<TR>\n");

sb.Append("<TD>\n");
sb.Append(@item.CampusName);
sb.Append("</TD>\n");
sb.Append("<TD>\n");
sb.Append(@item.OpenHours);
sb.Append("</TD>\n");

sb.Append("</TR>\n");
sb.Append("</TABLE > ");
}
Html.Raw(sb)
string dayStop=“Sunday”;
StringBuilder sb=新的StringBuilder();
某人附加(“\n”);
某人附加(“\n”);
foreach(位置中的var项目)
{
如果(item.Day!=dayStop)
{
某人附加(“\n”);
某人追加(@item.Day);
某人附加(“\n”);
//dayStop=@item.Day;
}
}
某人附加(“\n”);
某人附加(“\n”);
某人附加(“\n”);
sb.追加(@item.CampusName);
某人附加(“\n”);
某人附加(“\n”);
某人追加(@item.OpenHours);
某人附加(“\n”);
某人附加(“\n”);
某人加上(“”);
}
Html.Raw(sb)
但它不起作用。我希望@item.Day的值填充TH的值,但由于我列表中的每个项目都包含@item.CampusName的值Day,因此我最终得到了一大堆不必要的@item.Day值,我觉得foreach不是这里的正确答案。我想以下面的片段作为结束:


位置
星期日
星期一
星期二
第一校区
9 - 5
9 - 5
9 - 5
校园2
9 - 5
9 - 5
9 - 5

在xml中,您有多个
,因此对于
th
您必须采取不同于这些天的时间并进行渲染 对于连续的
tr
,您必须按行的
CampusName

尝试下面的代码,这将帮助您获得所需的结果

最佳做法是在操作方法中编写以下代码,并使用viewbag或viewmodel将结果传递给razor视图。您发布的相关代码在razor视图中,因此我也在razor中实现了我的代码。

<div>
    @{
        String URLString = "https://api3.libcal.com/api_hours_grid.php?iid=4246&format=xml&weeks=1&systemTime=0";
        XDocument xdoc = new XDocument();
        xdoc = XDocument.Load(URLString);


        var location = (from p in xdoc.Descendants("location")
                        from s in p.Descendants("week").Elements()
                        select new
                        {
                            CampusName = (string)p.Element("name"),
                            WeekD = (string)s.Element("date"),
                            OpenHours = (string)s.Element("rendered"),
                            Day = s.Name.LocalName
                        }).ToList();


        string dayStop = "Sunday";

        StringBuilder sb = new StringBuilder();
        sb.Append("<table>\n");
        sb.Append("<tr>\n");


        string currentLocation = "";

        foreach (var item in location.GroupBy(x => x.Day).Select(x => x.First()))
        {
            if (item.CampusName != currentLocation)
            {
                sb.Append("<th style='width:150px;'>\n");
                sb.Append("Location");
                sb.Append("</th>\n");
                currentLocation = item.CampusName;
            }

            if (item.Day != dayStop)
            {
                sb.Append("<th style='width:150px;'>\n");
                sb.Append(item.Day);
                sb.Append("</th>\n");
            }

        }

        sb.Append("</tr>\n");


        currentLocation = "";

        foreach (var item in location.GroupBy(x => x.CampusName))
        {
            sb.Append("<tr>\n");
            foreach (var innerItem in item)
            {
                if (innerItem.CampusName != currentLocation)
                {
                    sb.Append("<td>\n");
                    sb.Append(innerItem.CampusName);
                    sb.Append("</td>\n");
                    currentLocation = innerItem.CampusName;
                }


                if (innerItem.Day != dayStop)
                {
                    sb.Append("<td>\n");
                    sb.Append(innerItem.OpenHours);
                    sb.Append("</td>\n");
                }
            }

            sb.Append("</tr>\n");

        }

        @Html.Raw(sb.ToString());
    }

</div>
以上两个片段的输出:


是否将stringbuilder输出到.HTML文件?你是如何呈现HTML的?@TjaartvanderWalt我使用的是HTML.Raw(sb)你的xml包含了太多重复的日子,比如周一来了6次,其他日子也一样,那么在这种情况下你的HTML会是什么呢?@DragandDrop我不太确定我是否理解你的意思,但我想答案是现在。如果您使用的是
html.Raw(sb)
您使用的是ASP.NET MVC,则需要在razor文件中使用类似html.Raw(sb)@IcantCode的内容生成html表,对吗?或者至少是刮胡刀页面?@IcantCode,查看答案可能对你有帮助:)
@{
    string currentLocation1 = "";
    string currentLocation2 = "";
    string dayStop1 = "Sunday";
}

<table>
    <thead>
        <tr>
            @foreach (var item in location.GroupBy(x => x.Day).Select(x => x.First()))
            {
                if (item.CampusName != currentLocation1)
                {
                    <th style='width:150px;'>Location</th>
                    currentLocation1 = item.CampusName;
                }

                if (item.Day != dayStop1)
                {
                    <th style='width:150px;'>@item.Day</th>
                }
            }
        </tr>
    </thead>
    <tbody>
        @foreach (var item in location.GroupBy(x => x.CampusName))
        {
            <tr>
                @foreach (var innerItem in item)
                {
                    if (innerItem.CampusName != currentLocation2)
                    {
                        <td>@innerItem.CampusName</td>
                        currentLocation2 = innerItem.CampusName;
                    }


                    if (innerItem.Day != dayStop1)
                    {
                        <td>@innerItem.OpenHours</td>
                    }
                }

            </tr>
        }
    </tbody>
</table>