我有一个 47mb XML文件,我必须在我的应用程序上一遍又一遍地阅读,但大多数情况下它只需要一个给定术语定义的1个节点。
示例:
<customers>
<customer>
<id>someid</id>
<name>somename</name>
</customer>
<customer>
<id>someid</id>
<name>somename</name>
</customer>
...
<customer>
<id>someid</id>
<name>somename</name>
</customer>
<customer>
<id>someid</id>
<name>somename</name>
</customer>
</customers>
所以我想在程序加载后将xml加载到Dictionary或List中,并在应用程序关闭之前将其保留在那里重复使用。
如果我必须使用字典,例如:
private Dictionary<int,string> myCustomerList = new Dictionary<int,string>();
我可以稍后使用它来获取我需要的信息:
if (myCustomerList.ContainsKey(keyX))
myValue = myCustomerList[keyX];
答案 0 :(得分:1)
您的方法没有任何功能上的错误,但是当向客户添加更多信息时会发生什么? 例如,您可能有一个“location”元素:
<customer>
<id>someid</id>
<name>somename</name>
<location>somename</location>
</customer>
还要考虑将数据移动到数据库的情况 - 您必须重写大量代码。
在应用程序的持续时间内直接使用XML对象通常被认为是不好的做法。 “正确”的方法是首先将XML数据加载到面向对象的对象中。
您应该创建一个名为Customer
的类,并使用List<Customer> customers =new List<Customer>()
来存储对象。然后,您可以使用customers.Find(x=>x.Id == myId)
找到您的对象。
请记住,如果将对象存储在内存中,应用程序将使用至少47mb的RAM。随着您的业务获得更多客户,这可能会增长。也许您应该考虑延迟加载客户(在需要时从XML文件中检索它们) - 这将更慢,因此它实际上取决于您的吞吐量和数量要求。
答案 1 :(得分:1)
你的approch非常正确。如果以后将更多信息添加到客户类,则使用list generic class,否则您的approch是正确的。
列表 - 我最喜欢的一个 - 可以与泛型一起使用,因此您可以使用强类型数组,例如:名单。除此之外,其行为与ArrayList非常相似。
字典 - 与上面相同,仅通过泛型强类型,例如Dictionary
一直使用List和Dictionary。
答案 2 :(得分:1)
我想说47 MB的文件,在数据表中一次加载将非常容易,也有利于搜索。
您应该考虑使用WeakReferences将此数据表存储在内存中。
答案 3 :(得分:1)
47MB是应用程序始终保留在内存中的相当大的数据。
但是,您可以将XmlReader
与XNode.ReadFrom
结合使用,以读取内存较少的大型Xmls。
您可以使用此方法编写一个返回节点集合的方法,在读取节点时生成每个节点。通过此方法,您可以处理任意大型XML 文件,而内存占用非常小。