我有一个大的XML文档(111 MB),并希望非常快速地转到特殊节点(通过索引)。该文档有大约1000000个节点,如下所示:
<Kt>
<PLZ>01067</PLZ>
<Ort>Dresden</Ort>
<OT>NULL</OT>
<Strasse>Potthoffstr.</Strasse>
</Kt>
我想&#34;跳转&#34;,例如到文档中的第一百万个节点,并从此开始阅读。必须忽略此后面的所有节点。我已经尝试过使用XMLReader,但这些操作始终是从第一个节点开始读取的。
int i = 0;// v-----------Index of the Node where I want to go!
while (reader.Read() == (i < 1000000))
{
if (reader.Name == "PLZ")
{
textBox1.Text = reader.ReadString();
}
if (reader.Name == "Ort")
{
textBox2.Text = reader.ReadString();
}
if (reader.Name == "OT")
{
textBox3.Text = reader.ReadString();
}
if (reader.Name == "Strasse")
{
textBox4.Text = reader.ReadString();
i++;
}
这就是XML-Document的结构外观!
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Kt.xsd" generated="2014-10-21T18:20:30">
<Kt>
<PLZ>01...</PLZ>
<Ort>Dresden</Ort>
<OT>NULL</OT>
<Strasse>NULL</Strasse>
</Kt>
<Kt>
<PLZ>01067</PLZ>
<Ort>Dresden</Ort>
<OT>Innere Altstadt</OT>
<Strasse>Marienstr.</Strasse>
</Kt>
<Kt>
<PLZ>01067</PLZ>
<Ort>Dresden</Ort>
<OT>NULL</OT>
<Strasse>Potthoffstr.</Strasse>
</Kt>
换句话说:在不阅读完整文件的情况下,可以将大型xml文件的一部分加载出来。
答案 0 :(得分:6)
您将 读取到那时为止的所有数据,因为xml(与大多数基于文本的反序列化格式一样)不适合跳过数据。 XmlReader
有一些辅助方法可以帮助解决此问题,例如ReadToNextSibling
和ReadToFollowing
。基本上,除非您使用各种元素的字节偏移(例如,每100或1000个元素)预先索引文件(单独),否则这是您所做的最好的事情。并且执行 意味着您正在以片段(而不是文档)模式工作,并且您需要非常小心命名空间(特别是:在文档根目录上声明的别名)
基本上,如果我们以拥有一个111MB,数百万元素的xml文件为前提,那么你正在做的事情似乎关于正确的。坦率地说,我的建议是首先不要那样做。对于大数据,Xml不是一个好的选择,除非它纯作为死点,或许以后再次批量加载。它不允许有效的随机访问。
答案 1 :(得分:1)
如果你经常需要这样做,那么你做错了。数据应该在数据库中,或者至少存储在较小的块中。
如果你不经常这样做,那真的是一个问题吗?我希望它能在5秒左右的时间内完成。