2014-10-31 3 views
2

У меня есть большой XML-документ (111 МБ), и я хочу перейти на специальный узел (по индексу) очень быстро. Документ имеет около 1000000 узлов, как это:Как установить начальную точку для чтения xml-файла?

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

Я хочу «прыгать», например, к узлу одна миллионная в документе, и начать с этого читать. Все узлы позади этого должны игнорироваться. Я уже пробовал это с помощью 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-файла без чтения полного файла.

+0

Запишите этот недостаток в xml. Всегда очень удобно использовать изначально, но для любого приличного количества данных текстовый формат вас подведет. – Gusdor

ответ

6

Вы должны прочитать все данные до этого момента, потому что XML (вместе с большинством текстовых форматов десериализации) не поддается пропуска данных. XmlReader предлагает несколько вспомогательных методов, например ReadToNextSibling и ReadToFollowing. В основном, это лучшее, что вы сделаете, если вы предварительно проиндексируете файл (отдельно) с байтовыми смещениями различных элементов (скажем, каждый 100-й или 1000-й элемент). И делая , что означает, что вы будете работать в режиме фрагмента (а не в документе), и вам нужно быть очень осторожным в отношении пространств имен (в частности: псевдонимы, объявленные в корневом каталоге документа).

В основном, что вы делаете, кажется о праве, если мы начнем с предпосылки наличия файла размером в 111 МБ, многомиллионного элемента. Честно говоря, мой совет будет не делайте этого в первую очередь. Xml не является хорошим выбором для огромных данных, если только он не является чисто как мертвая капля, возможно, снова загружена. Это не позволяет обеспечить эффективный произвольный доступ.

+0

@ user3347346 (в ответ на комментарий, который был удален), это противоречивые требования; xml ** не подходит ** для комбинации «очень быстрый», «произвольный доступ» и «огромный». Если вам нужен быстрый произвольный доступ, загрузите его в базу данных * сначала * и выполните доступ к правильно проиндексированной базе данных. Или, по крайней мере: используйте другой формат файла, который позволяет пропускать - почти наверняка бинарный формат (я мог бы предложить пару, но они не будут xml в любом случае). –

+0

@ user3347346 или в лучшем случае: как я уже упоминал, предварительно проиндексируйте xml-файл и примите боль от разрешения псевдонима –

1

Если вам нужно делать это часто, то вы делаете не то. Данные должны быть в базе данных или, по крайней мере, храниться в небольших кусках.

Если вы не часто это делаете, то это действительно проблема? Я ожидал, что это будет выполнимо через 5 секунд или около того.