更新大型xml文档

时间:2015-08-20 23:00:55

标签: c# xml

XML:

<database totalkeys="172" totalvalues="98014">
     <key id="k1" name="Key1" valuecount="3">
         <value id="v1" name="Value1"/>
         <value id="v2" name="Value2"/>
         <value id="v3" name="Value3"/>
     </key>
     <key id="k2" name="Key2" valuecount="3">
         <value id="v1" name="Value1"/>
         <value id="v2" name="Value2"/>
         <value id="v3" name="Value3"/>
     </key>
</database>

实际的XML本身要大得多,你可以通过totalkeys和totalvalues属性看到。每个<key>都有5到19000个值。

为了更新XML,我必须从三个不同的来源收集信息。从这些来源我创建了3个词典。

  1. Dictonary<string, List<string>> - &gt; <keyId, List<valueIds>>
  2. Dictonary<string, string> - &gt; <keyId, keyName>
  3. Dictonary<string, string> - &gt; <valueId, valueName>
  4. 如何更新XML而无需单独检查每个<key><value>是否已存在?目前我为每个使用SelectSingleNode,如果它返回null,我创建节点并将其附加到xml。这很慢。有没有更快的方法来解决这个问题?对于这么大的数据库,XML是否是正确的选择?

1 个答案:

答案 0 :(得分:3)

是的,这会很慢。 XML文件未编入索引,因此当您发出SelectSingleNode查询时,必须从文件的开头开始,然后检查每个键元素,然后检查该键的每个子元素。 XML的设计并不容易搜索 - 或者像数据库一样使用。

正如@Matthew Haugen在评论中建议的那样,当您阅读XML时,您可以将XML解析为字典。然后您可以快速检查是否存在密钥。这只有在你需要进行大量更新时才有意义,这样解析整个文件的成本就低于进行搜索。这也会占用大量内存。

但这里的根本问题是XML并不是一个数据库,因为你发现大型XML文件很慢。看起来您正在尝试使用XML重新实现relation database。因此,您应该考虑将数据存储在SQL数据库中。您可以使用进程数据库,如SQL Lite甚至Microsoft Access数据库,这样您就不必设置服务器。