如何从xml中读取满足或满足特定条件的数据

时间:2013-08-07 15:55:22

标签: c# xml xml-serialization xmlserializer

如果我有这个数据模型类:

public class Person
{
    private int _id;
    private int _deptID;
    private string _firstName;
    private string _lastName;

    public int ID
    {
        get { return _deptID; }
        set { _deptID = value; }
    }

    public int DeptID
    {
        get { return _id; }
        set { _id = value; }
    }

    public string FirstName
    {
        get { return _firstName; }
        set { _firstName = value; }
    }

    public string LastName
    {
        get { return _lastName; }
        set { _lastName = value; }
    }

...然后创建我的数据集

    private List<Person> GeneratePersonData()
    {
        List<Person> personData = new List<Person>();
      personData.Add(new Person() { ID = 1, DeptID = 25, FirstName = "John", LastName = "Doe" });
        personData.Add(new Person() { ID = 2, DeptID = 25, FirstName = "John", LastName = "Doe" });
        personData.Add(new Person() { ID = 3, DeptID = 105, FirstName = "John", LastName = "Doe" });
        personData.Add(new Person() { ID = 4, DeptID = 43, FirstName = "John", LastName = "Doe" });
        personData.Add(new Person() { ID = 5, DeptID = 25, FirstName = "John", LastName = "Doe" });
        personData.Add(new Person() { ID = 6, DeptID = 32, FirstName = "John", LastName = "Doe" });
        personData.Add(new Person() { ID = 7, DeptID = 2, FirstName = "John", LastName = "Doe" });
        personData.Add(new Person() { ID = 8, DeptID = 25, FirstName = "John", LastName = "Doe" });
        personData.Add(new Person() { ID = 9, DeptID = 2, FirstName = "John", LastName = "Doe" });

        return personData;
    }

然后我将数据存储到xml中:

    private void StorePersonData()
    { 
    XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
        xmlWriterSettings.Indent = true;

        using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream stream = myIsolatedStorage.OpenFile("Person.xml", FileMode.Create))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(List<Person>));
                using (XmlWriter xmlWriter = XmlWriter.Create(stream, xmlWriterSettings))
                {
                    serializer.Serialize(xmlWriter, GeneratePersonData());
                }
            }
        }
    }

现在,我想要做的是只读取xml中具有特定deptID的人到新列表中,所以我这样做:

    private void ReadPersonData(int deptID)
    {
        List<Person>data = new List<Person>();
        List<Person> newData = new List<Person>();

        using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream stream = myIsolatedStorage.OpenFile("Person.xml", FileMode.Open))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(List<Person>));
                 data = (List<Person>)serializer.Deserialize(stream);
            }
        }

        for (int i = 0; i < data.Count; i++)
        {
            if (data[i]._deptID == deptID)
            {
                newData.Add(data[i]);
            }
        }
    }
}

但是如果我有一个非常大的数据集,这种方法会非常慢。在xml中是否有一种方法只能读取满足某种条件的数据?

2 个答案:

答案 0 :(得分:0)

不 - 一旦你采用了在XML中保存数据并然后查询它的方法,那么对于大数据集来说它必须很慢。

这是静态数据还是会发生变化?如果是静态数据,为什么不将xml保留在内存中?

注1:为什么不在JSON对象中序列化,而不是XML。尺寸会小得多,因此你会看到一些改进。

注意2:当您与不同的应用程序(例如一个内置的.net和一个内置的java)交谈时,以JSON和XML保存数据是很好的。使用这些开放格式,您可以轻松传递数据。我看到的是,你存储数据和你读数据?为什么选择XML(或JSON)?

<强>更新

对于JSON序列化 - 您可以使用http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

如果此xml永远不会更改,则不要每次都读取它。读取并解析xml,将其保存在memomry中,各种方式(会话,静态变量,缓存)。

为什么不使用DB存储相同的信息?一个应用程序可以在DB中写入数据,其他应用程序可以从DB中检索数据吗?

答案 1 :(得分:0)

您可能需要重新考虑使用XML来存储数据。您的数据中没有太多结构,您正在进行随机访问。看起来数据库似乎可以更好地存储,索引和检索/过滤这些数据;然后,您可以根据需要将结果集导出到XML。