如何设置读取xml文件的起点?

时间:2014-10-31 12:06:44

标签: c# xml

我有一个大的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文件的一部分加载出来。

2 个答案:

答案 0 :(得分:6)

您将 读取到那时为止的所有数据,因为xml(与大多数基于文本的反序列化格式一样)不适合跳过数据。 XmlReader有一些辅助方法可以帮助解决此问题,例如ReadToNextSiblingReadToFollowing。基本上,除非您使用各种元素的字节偏移(例如,每100或1000个元素)预先索引文件(单独),否则这是您所做的最好的事情。并且执行 意味着您正在以片段(而不是文档)模式工作,并且您需要非常小心命名空间(特别是:在文档根目录上声明的别名)

基本上,如果我们以拥有一个111MB,数百万元素的xml文件为前提,那么你正在做的事情似乎关于正确的。坦率地说,我的建议是首先不要那样做。对于大数据,Xml不是一个好的选择,除非它作为死点,或许以后再次批量加载。它不允许有效的随机访问。

答案 1 :(得分:1)

如果你经常需要这样做,那么你做错了。数据应该在数据库中,或者至少存储在较小的块中。

如果你不经常这样做,那真的是一个问题吗?我希望它能在5秒左右的时间内完成。