C# 使用StringBuilder将列表转换为HTML表
在Stack overflow社区的帮助下,我已经能够从XML文档中获取一些数据,并使用以下代码将其添加到列表中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
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>