Сброс StreamReader для нескольких применений XmlReader.Read()

#c# #streamreader #xmlreader

#c# #streamreader #xmlreader

Вопрос:

Я хотел бы повторно использовать StreamReader, который я связал с XML-файлом, для вызовов .Read() из System.Xml.XmlReader.

В принципе, я собрал небольшой метод расширения, содержащий следующий код:

  public static string GetValueByPath(this StreamReader str, string attributeName, params string[] nodes)
    {
        str.BaseStream.Position = 0;
        XmlReader reader = XmlReader.Create(str);
        // Stuff happens here now, not important for the question
    }
  

StreamReader, вызывающий этот метод расширения, остается неизменным на протяжении всего сеанса.

В первый раз это работает просто отлично, но если я использую этот метод во второй раз, я получаю System.Xml-исключение. Нет ли способа эффективно «сбросить» StreamReader?

Спасибо,

Деннис

Ответ №1:

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

Вы должны утилизировать старый StreamReader и каждый раз создавать новый.

Комментарии:

1. Спасибо за ваш ответ, я боялся, что это будет так. Возможно, вы не знаете способ сделать это внутри веб-приложения ASP без излишнего раздувания кода?

2. @Деннис, не уверен, что ты имеешь в виду… Я не могу ответить на этот вопрос, не видя вашего кода

Ответ №2:

StreamReader это не дорогой объект для создания, поэтому, пока базовый поток поддерживает установку позиции, вы должны просто создавать новый StreamReader для него каждый раз.

Ответ №3:

Поскольку это буферизация, вам необходимо удалить буфер в дополнение к сбросу позиции.

             sr.BaseStream.Position = 0;
            sr.DiscardBufferedData();
  

Я сделал это, когда я хочу знать, сколько строк в файле, который я собираюсь проанализировать (1-й проход подсчитывает строки, 2-й проход анализирует и сохраняет результаты).

Ответ №4:

Вы пробовали добавить это в конец вашего метода?

 reader.Close();
  

Возможно, ваш reader неправильно закрывается, что вызывает проблемы при следующем чтении.