我有以下列表 -
List<string> finalMessageContent
其中
finalMessageContent[0] = "<div class="mHr" id="mFID">
<div id="postedDate">11/12/2015 11:12:16</div>
</div>" // etc etc
我正在尝试按照entires - postedDate
标记中的特定值对列表进行排序。
首先,我创建了一个新对象,然后将其序列化以使html元素能够被解析 -
string[][] newfinalMessageContent = finalMessageContent.Select(x => new string[] { x }).ToArray();
string json = JsonConvert.SerializeObject(newfinalMessageContent);
JArray markerData = JArray.Parse(json);
然后使用Linq尝试使用OrderByDescending进行排序 -
var items = markerData.OrderByDescending(x => x["postedDate"].ToString()).ToList();
但是在尝试使用 -
解析条目时失败了Accessed JArray values with invalid key value: "postedDate". Array position index expected.
也许linq不是去这里的方式,但它似乎是最优化的,我哪里出错?
答案 0 :(得分:4)
首先,我不会使用字符串方法,正则表达式或JSON解析器来解析HTML。我会用HtmlAgilityPack
。然后你可以提供这样一种方法:
private static DateTime? ExtractPostedDate(string inputHtml, string controlID = "postedDate")
{
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(inputHtml);
HtmlNode div = doc.GetElementbyId(controlID);
DateTime? result = null;
DateTime value;
if (div != null && DateTime.TryParse(div.InnerText.Trim(), DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out value))
result = value;
return result;
}
并遵循LINQ查询:
finalMessageContent = finalMessageContent
.Select(s => new { String = s, Date = ExtractPostedDate(s) })
.Where(x => x.Date.HasValue)
.OrderByDescending(x => x.Date.Value)
.Select(x => x.String)
.ToList();
答案 1 :(得分:0)
Json Serializer序列化JSON类型的字符串。 Example here to json
要解析HTML我建议使用HtmlAgility https://htmlagilitypack.codeplex.com/
像这样:
HtmlAgilityPack.HtmlDocument htmlparsed = new HtmlAgilityPack.HtmlDocument();
htmlParsed.LoadHtml(finalMessageContent[0]);
List<HtmlNode> OrderedDivs = htmlParsed.DocumentNode.Descendants("div").
Where(a => a.Attributes.Any(af => af.Value == "postedDate")).
OrderByDescending(d => DateTime.Parse(d.InnerText)); //unsafe parsing
答案 2 :(得分:0)
不知道我的问题是否正确。 但是你知道你可以用XPath解析HTML吗?
foreach (var row in doc.DocumentNode.SelectNodes("//div[@id="postedDate"]"))
{
Console.WriteLine(row.InnerText);
}
这只是我头脑中的一个例子,您可能需要根据您的文档仔细检查XPath查询。您还可以考虑将其转换为数组或解析日期并使用它进行其他转换。
就像我说的那样,这只是我的头脑。或者,如果html不那么完整,请考虑使用RegEx
提取日期,但这将成为另一个问题的主题。
HTH