1
            DataSet ds = new DataSet();
            DataTable dataTable = new DataTable();
            ds.ReadXml("File.xml");
            dataTable = ds.Tables[0];
            LoadListView(dataTable);  

  <?xml version="1.0"?>
    <Book>
       <note1>
        <to>Tove</to>
        <from>Jani</from>
        <heading>Reminder</heading>
        <body>Don't forget me this weekend!</body>
      </note1>
    </Book>

我正在读取数据集中的整个 xml 文件,然后将所有记录显示到 Listview。但是当我将所有数据加载到列表视图时,内存消耗更多。数据表占用了我机器的所有内存,并且在某些时候给了我一个内存异常异常。是否可以在过滤后加载数据表。上面是我的 xml 文件,它有多个节点,我只需要加载数据表中的那些节点,这些节点的 XmlElement 以“j”开头。 我会很感激你的答案。 我不想使用 XMlDocument 或 Xpathquery 或 LINQ to XML

4

1 回答 1

2

这是基于您知道 XML 文件的结构(即格式具有稳定、统一的结构)的相当弱的假设。另外,我不知道这会给您的情况带来什么性能改进(因为实例化了更多对象)。但让我们试一试。

class Program
{
    static void Main(string[] args)
    {
        List<string> list = new List<string>();
        List<int> positions = new List<int>();
        bool checkNext = false;
        int position = -1;

        DataTable dataTable = new DataTable();
        dataTable.Columns.Add("to");
        dataTable.Columns.Add("from");
        dataTable.Columns.Add("heading");
        dataTable.Columns.Add("body");

        var rs = new XmlReaderSettings();
        rs.IgnoreWhitespace = true;

        using (var reader = XmlReader.Create(File.OpenRead("data.xml"), rs))
        {
            while (reader.Read())
            {
                if (reader.Name == "")
                {
                    list.Add(reader.Value);
                    position++;
                }
                if (checkNext)
                {
                    // TODO: apply your filter
                    if (reader.Value.ToLower().StartsWith("j"))
                    {
                        positions.Add(position);
                    }
                }
                if (reader.Name == "from")
                {
                    checkNext = !checkNext;
                }
            }
        }

        foreach (int match in positions)
        {
            dataTable.Rows.Add(
                list[match - 1],
                list[match],
                list[match + 1],
                list[match + 2]);
        }

        //LoadListView(dataTable);  
    }
}
于 2013-02-13T14:48:52.697 回答