首页 > 解决方案 > 将 XML 文件加载和保存到 Listview

问题描述

将我的 XML 文件加载到 Listview 时,我遇到了一个小问题。它没有加载所有值,它只加载单个节点。你能告诉我我的循环加载值有什么问题吗?或者有什么建议可以让它更好地工作吗?

有人建议我使用 JSON.net 来更轻松地加载和保存到 listview,但找不到有关它的资源。所以我只是做了xml,因为这只是我在保存和加载文件时所知道的。

这是xml文件:

 <?xml version="1.0" encoding="utf-8"?>
<Settings>
  <title><![CDATA[Episode 1]]></title>
  <duration><![CDATA[59.33]]></duration>
  <resolution><![CDATA[1280x560]]></resolution>
  <title><![CDATA[Episode 2]]></title>
  <duration><![CDATA[01.04.25]]></duration>
  <resolution><![CDATA[1280x560]]></resolution>
</Settings>
    private void button1_Click(object sender, EventArgs e)
    {
        var file = @"C:\Users\MARK\Desktop\__TEST\SAMPLE.xml";

        if (File.Exists(file))
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(file);
            XmlNodeList topM = doc.SelectNodes("Settings");

            LV.BeginUpdate();
            foreach (XmlElement element in topM)
            {
                ListViewItem items = new ListViewItem();

                XmlNodeList Title = element.GetElementsByTagName("title");
                for (int i = 0; i < Title.Count; i++)
                {
                    items.Text = Title[i].InnerText;
                }

                XmlNodeList Duration = element.GetElementsByTagName("duration");
                for (int i = 0; i < Duration.Count; i++)
                {
                    items.SubItems.Add(Duration[i].InnerText);
                }

                XmlNodeList Resolution = element.GetElementsByTagName("resolution");
                for (int i = 0; i < Resolution.Count; i++)
                {
                    items.SubItems.Add(Resolution[i].InnerText);
                }

                LV.Items.Add(items);
            }
            LV.EndUpdate();
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        var file = @"C:\Users\MARK\Desktop\__TEST\SAMPLE.xml";

        using (XmlTextWriter xml = new XmlTextWriter(file, Encoding.UTF8))
        {
            xml.Formatting = System.Xml.Formatting.Indented;
            xml.WriteStartDocument();
            xml.WriteStartElement("Settings");

            foreach (ListViewItem i in LV.Items)
            {
                xml.WriteStartElement("title"); 
                xml.WriteCData(i.Text.ToString()); 
                xml.WriteEndElement();

                xml.WriteStartElement("duration"); 
                xml.WriteCData(i.SubItems[1].Text); 
                xml.WriteEndElement();
                
                xml.WriteStartElement("resolution"); 
                xml.WriteCData(i.SubItems[2].Text); 
                xml.WriteEndElement();
            }

            xml.WriteEndElement();
            xml.WriteEndDocument();
        }
    }

标签: c#xml

解决方案


经过一个小时的搜索和分析。这是我使用 BinaryFormatter 发现的。

这也可能对其他人有所帮助:)

   private void SaveBinary(ListView lv)
    {
        using (SaveFileDialog sfd = new SaveFileDialog())
        {
            sfd.Filter = "*.bin|*.bin";
            sfd.RestoreDirectory = true;

            if (sfd.ShowDialog() == DialogResult.OK)
            {
                ListViewItem[] items = new ListViewItem[lv.Items.Count];
                lv.Items.CopyTo(items, 0);
                // Serialize the items and save it to a file.
                using (FileStream fs = File.Create(sfd.FileName))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Serialize(fs, items);
                }
                this.Text = "Data has been saved";
            }
        }
    }
    private void LoadBinary(ListView lv)
    {
        using (OpenFileDialog ofd = new OpenFileDialog())
        {
            ofd.Filter = "*.bin|*.bin";
            ofd.RestoreDirectory = true;
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                ListViewItem[] items = null;
                // Deserialize the items from the binary file.
                using (FileStream fs = File.OpenRead(ofd.FileName))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    items = (ListViewItem[])bf.Deserialize(fs);
                }

                lv.Items.Clear();
                lv.BeginUpdate();
                // Load the items into the listView1.Items collection.
                lv.Items.AddRange(items);
                lv.EndUpdate();
            }
            this.Text = "Data has been loaded";
        }
    }

来源:https ://www.experts-exchange.com/questions/27293776/Load-and-save-the-content-of-a-listview-to-binary-file.html


推荐阅读