Как выполнить потоковое чтение большого XML-файла в C# 3.5

StackOverflow https://stackoverflow.com/questions/45481

Вопрос

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

Это было полезно?

Решение

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

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);
      }
    }
  }
}

Другие советы

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

Текущий:

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

Зафиксированный:

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

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

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

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

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

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

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

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

Этот пример кода пытается превратить код стиля XmlReader в код стиля SAX — если вы пишете код с нуля, я бы просто использовал XmlReader так, как он был задуман — Pull, а не Push.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top