我正在尝试将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 });
}
任何帮助都会一如既往地受到高度赞赏。
编辑:澄清一下,我在
上遇到了NullReferenceExceptionstring filename = download.Element("filename").Value;
我知道列表视图丢失了,我还没有那么做:)
答案 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);
}
}