Как сделать потоковое чтение большого XML файла в С# 3.5

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

Ответ 1

Переход с помощью парсера элементов стиля 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);
      }
    }
  }
}

Ответ 2

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

Текущее:

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

Исправлено:

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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