安全地解析XML

时间:2014-03-11 03:35:43

标签: c# xml xml-documentation

我被要求编写一个采用以下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完成吗?

1 个答案:

答案 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
 }