Как сделать потоковое чтение большого файла XML в C # 3.5 - PullRequest
10 голосов
/ 05 сентября 2008

Как выполнить потоковое чтение для большого файла XML, который содержит последовательность xs: чуть ниже корневого элемента, без загрузки всего файла в экземпляр XDocument в памяти?

Ответы [ 6 ]

9 голосов
/ 05 сентября 2008

Использование парсера в стиле SAX и класса XmlTextReader , созданного с помощью XmlReader.Create , было бы хорошей идеей, да. Вот немного измененный пример кода из CodeGuru :

void ParseURL(string strUrl)
{
  try
  {
    using (var reader = XmlReader.Create(strUrl))
    {
      while (reader.Read())
      {
        switch (reader.NodeType)
        {
          case XmlNodeType.Element:
            var attributes = new Hashtable();
            var strURI = reader.NamespaceURI;
            var strName = reader.Name;
            if (reader.HasAttributes)
            {
              for (int i = 0; i < reader.AttributeCount; i++)
              {
                reader.MoveToAttribute(i);
                attributes.Add(reader.Name,reader.Value);
              }
            }
            StartElement(strURI,strName,strName,attributes);
            break;
            //
            //you can handle other cases here
            //
            //case XmlNodeType.EndElement:
            // Todo
            //case XmlNodeType.Text:
            // Todo
            default:
            break;
          }
        }
      }
      catch (XmlException e)
      {
        Console.WriteLine("error occured: " + e.Message);
      }
    }
  }
}
7 голосов
/ 02 февраля 2009

Я не могу добавить комментарий, так как я только что зарегистрировался, но в примере кода, опубликованном Hirvox и выбранном в качестве ответа, есть ошибка. Он не должен иметь оператора new при использовании статического метода Create.

Ток:

using (var reader = new XmlReader.Create(strUrl))

Исправлено:

using (var reader = XmlReader.Create(strUrl))
0 голосов
/ 05 сентября 2008

Этот пример кода пытается превратить код стиля XmlReader в код стиля SAX - если вы пишете код с нуля, я бы просто использовал XmlReader, как и было задумано - «Потяните, а не нажмите».

0 голосов
/ 05 сентября 2008

Меня смущает упоминание "xs: sequence" - это элемент схемы XML.

Вы пытаетесь открыть большой файл XML-схемы? Вы открываете большой XML-файл, основанный на этой схеме? Или вы пытаетесь открыть большой XML-файл и одновременно проверить его?

Ни в одной из этих ситуаций не должно возникнуть проблем с использованием стандартного XmlReader (или XmlValidatingReader).

Чтение XML с помощью XMLReader: http://msdn.microsoft.com/en-us/library/9d83k261(VS.80).aspx

0 голосов
/ 05 сентября 2008

Вот как это сделать: http://support.microsoft.com/kb/301228/en-us Просто помните, что вы не должны использовать XmlTextReader, а вместо XmlReader вместе с XmlReader.Create

0 голосов
/ 05 сентября 2008

Я думаю, что это невозможно, если вы хотите использовать объектную модель (то есть XElement \ XDocument) для запроса XML. Очевидно, что вы не можете построить дерево объектов XML без чтения достаточного количества данных. Однако вы можете использовать XmlReader class.

Класс XmlReader читает данные XML из потока или файла. Это обеспечивает без кэширования, только для пересылки, только для чтения доступ к данным XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...