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にディスパッチします。しかし、すべてのデータをリストビューにロードすると、メモリ消費量が増えます。Datatableは私のマシンのすべてのメモリを取得し、コースから外れると、メモリ不足の例外が発生します。フィルタの後にdatatableをロードすることは可能ですか。上記は、複数のノードを持つ私のxmlファイルで、「j」で始まるXmlElementを持つデータテーブル内のノードのみをロードする必要があります。 答えていただければ幸いです。 XMlDocument、Xpathquery、またはLINQtoXMLを使用したくない

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 に答える