【问题标题】:How to set the start point for reading an xml file?如何设置读取xml文件的起点?
【发布时间】:2014-10-31 23:38:26
【问题描述】:

我有一个很大的 XML 文档 (111 MB),并且想要非常快地转到一个特殊的节点(按索引)。文档有大约 1000000 个这样的节点:

<Kt>
<PLZ>01067</PLZ>
<Ort>Dresden</Ort>
<OT>NULL</OT>
<Strasse>Potthoffstr.</Strasse>
</Kt>

我想“跳转”,例如到文档中的第 100 万个节点,然后从这里开始阅读。必须忽略此后面的所有节点。我已经用 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 文档的结构!

<?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 文件的一部分的可能性是什么。

【问题讨论】:

  • 记下 xml 的这个缺点。最初使用总是非常方便,但对于任何数量可观的数据,基于文本的格式会让您失望。

标签: c# xml


【解决方案1】:

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

基本上,如果我们以拥有一个 111MB、数百万个元素的 xml 文件为前提,您所做的似乎差不多。坦率地说,我的建议是一开始就不要这样做。对于大数据,Xml 不是一个好的选择,除非它纯粹作为一个死点,也许以后会再次批量加载。它不允许有效的随机访问。

【讨论】:

  • @user3347346(回复现已删除的评论)这些是相互冲突的要求; xml 不适合“非常快”、“随机访问”和“巨大”的组合。如果您需要快速随机访问,请将其批量加载到数据库中首先,然后针对正确索引的数据库进行访问。或者至少:使用允许跳过的不同文件格式 - 几乎可以肯定是某种二进制格式(我可以建议一对,但它们绝不会是 xml)。
  • @user3347346 或充其量:正如我已经提到的,预先索引 xml 文件并接受别名解析的痛苦
【解决方案2】:

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

如果您不经常这样做,那真的有问题吗?我希望它可以在 5 秒左右内完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    相关资源
    最近更新 更多