我被要求编写一个采用以下XML结构的方法,并将其解析为List<>对象:
<?xml version="1.0" encoding="UTF-8"?>
<comments>
<comment>
<date>11/MAR/2014 10:34am</date>
<userid>1</userid>
<text>This is a comment. Please remember to try with some formatting. I'm assuming that some charactors need to be prefixed with a backslash.</text>
</comment>
<comment>
<date>11/MAR/2014 10:37am</date>
<userid>1</userid>
<text>This is another comment./r/nIt\'s showing how more than one comment would be stored.\r\n\r\nAlso, this one has some really hardcore escape charactors!</text>
</comment>
</comments>
可以有很多'评论'。
因此,凭借我对XML的基本知识,我尝试了这个:
private List<Comment> XMLToList(string xml)
{
var result = new List<Comment>();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
XmlNodeList xnList = xmlDoc.SelectNodes("/comments/comment");
foreach (XmlNode node in xnList)
{
var id = node["userid"].InnerText;
var date = node["date"].InnerText;
var text = node["texts"].InnerText;
result.Add(new Comment
{
Date = DateTime.Parse(date),
Text = text,
UserID = int.Parse(id)
});
}
哪个有效,但非常不安全。如果缺少节点怎么办? Missplet?等
有没有办法确保首先正确格式化XML文档? 然后,有更安全的方式来获取数据吗?
(我可以修复日期和int值的解析......这只是一个测试。它更多是我试图解析的节点的访问。)
可以用Linq完成吗?
答案 0 :(得分:3)
您可以轻松地使用LINQ to XML:
var comments = XDocument.Parse(xml).Descendants("comment")
.Select(x => new Comment
{
Date = x.Element("date") != null ? (DateTime)x.Element("date") : default(DateTime),
Text = (string)x.Element("text"),
UserID =x.Element("userid") != null ? (int)x.Element("userid") : default(int)
}).ToList();
关键点是在接收值时使用显式强制转换。我已经添加了一些空值检查以避免ArgumentNullException
。当你尝试将null转换为ValueType.String时抛出它是不是问题,它只返回null。
如果您想确保xml格式有效,可以使用try/catch
,如下所示:
try
{
// parse the xml file
}
catch (XmlException ex)
{
// this exception is thrown by Parse method
// when the xml file format is invalid
}