C#Foreach XML节点

时间:2010-08-09 15:52:07

标签: c# .net xml

我正在尝试将XML文件中的所有节点添加到listView中,并且我做错了但是我不能在我的生活中找到它,即使在查看了大量示例之后。这是XML片段:

<queue>
<slots>
<slot>
<status>Downloading</status>
<filename>file1</filename>
<size>1 GB</size>
</slot>
<slot>
<status>Downloading</status>
<filename>file2</filename>
<size>2 GB</size>
</slot>
</slots>
</queue>

这是代码:

        XDocument xDoc = XDocument.Load(xmlFilePath);

        List<Download> list = new List<Download>();

        foreach (var download in xDoc.Descendants("slots"))
        {
            string filename = download.Element("filename").Value;
            string size = download.Element("size").Value;
            string status = download.Element("status").Value;
            list.Add(new Download { Filename = filename, Size = size, Status = status });              
        }

任何帮助都会一如既往地受到高度赞赏。

编辑:澄清一下,我在

上遇到了NullReferenceException
string filename = download.Element("filename").Value;

我知道列表视图丢失了,我还没有那么做:)

3 个答案:

答案 0 :(得分:3)

var list = (from download in xDoc.Descendats("slot")
            select new Download
                    {
                        Filename = (string) download.Element("filename"),
                        Size = (string) download.Element("size"),
                        Status = (string) download.Element("status")
                    }).ToList();

这看起来更好,而且由于你没有说明你的代码到底出了什么问题,所以我只能做所有事情。

更新:刚刚对此进行了测试,它修复了您的异常。

答案 1 :(得分:2)

您的示例中的XML工作正常。 NullReferenceException正在发生,因为您正在使用的真实XML在其中一个插槽中没有文件名元素。你可以使用

string filename = download.Element("filename") == null ? 
    String.Empty : download.Element("filename").Value;

相反,如果filename存在可能的默认值。但更有可能正确处理此异常更好。

答案 2 :(得分:1)

void LoadSlots()
{
  XmlDocument doc = new XmlDocument();
  doc.Load(Environment.CurrentDirectory + "\\queue.xml");

  XmlNodeList nodes = doc.SelectNodes("//queue/slots/slot");

  foreach (XmlNode node in nodes)
  {
    string filename = node.Attributes["filename"].InnerText;
    string size = node.Attributes["size"].InnerText;
    string status = node.Attributes["status"].InnerText;
    _slots.Add(filename, size, status);
  }
}