代码之家  ›  专栏  ›  技术社区  ›  Thorin Oakenshield

如何用C语言从ListView中编写XML文件#

  •  1
  • Thorin Oakenshield  · 技术社区  · 14 年前

    我有一个 ListView 像控制一样

    alt text

    所以xml文件将如下所示

    <root>
     <Child Name ="A1" val1="1" val2="0"/>
     <Child Name ="A2" val1="1" val2="2"/>
     <Child Name ="A3" val1="1" val2="3"/>
     <Child Name ="A4" val1="1" val2="4"/>
     <Child Name ="A5" val1="1" val2="5"/>
     <Child Name ="A6" val1="6" val2="0"/>
     <Child Name ="A7" val1="7" val2="0"/>
    </root>
    

    如果数据存储在 List Dictionary ,然后我知道要使用XML来实现这一点

    但是如何从列表视图中执行此操作

    XDocument XD=new XDocument(new XElement("root",........// what i have to do here.......
    

    请帮我。。。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Frédéric Hamidi    13 年前

    可以查询列表视图子项及其列标题:

    XDocument document = new XDocument(new XElement("root",
        from item in yourListView.Items.Cast<ListViewItem>()
        select new XElement("Child",
            item.SubItems.Cast<ListViewSubItem>()
                .Select((subitem, i) => new XAttribute(
                    i == 0 ? "Name" : yourListView.Columns[i].Text.ToLower(),
                    subItem.Text)))));
    

    编辑: 因为两者都不是 ListViewItemCollection ListViewSubItemCollection 支持开箱即用的查询运算符,我们需要调用 Cast<T>()

        2
  •  0
  •   gonzobrains Etienne Lawlor    12 年前

    这里有一个简单的例子。这里的目标是使用XmlTextWriter完成它。当然,需要修改此示例以满足特定的文件I/O和XML格式设置需要:

    public static bool ExportListViewlToXML(ListView listview, String filePath, String fileName)
        {
            FileStream fileStream;
            StreamWriter streamWriter;
            XmlTextWriter xmlTextWriter;
    
            try
            {
                // overwrite even if it already exists
                fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None);
    
                streamWriter = new StreamWriter(fileStream);
                xmlTextWriter = new XmlTextWriter(streamWriter);
                xmlTextWriter.Formatting = Formatting.Indented;
                xmlTextWriter.WriteStartDocument();
                xmlTextWriter.WriteStartElement("Items");
    
                const int SUBITEM1_POS = 0;
                const int SUBITEM2_POS = 1;
                const int SUBITEM3_POS = 2;
    
                for (int i = 0; i < listview.Items.Count; i++)
                {
                    String currentSubItem1 = listview.Items[i].SubItems[SUBITEM1_POS].Text;
                    String currentSubItem2 = listview.Items[i].SubItems[SUBITEM2_POS].Text;
                    String currentSubItem3 = listview.Items[i].SubItems[SUBITEM3_POS].Text;
    
                    xmlTextWriter.WriteStartElement("Item");
                    xmlTextWriter.WriteAttributeString("subitem1", currentSubItem1.ToString());
                    xmlTextWriter.WriteAttributeString("subitem2", currentSubItem2.ToString());
                    xmlTextWriter.WriteAttributeString("subitem3", currentSubItem3.ToString());
                    xmlTextWriter.WriteEndElement();
                }
    
                xmlTextWriter.WriteEndDocument();
                xmlTextWriter.Flush();
                xmlTextWriter.Close();
    
                return true;
            }
            catch (IOException ex)
            {
                // do something about your error
                return false;
            }
        }