Возникла следующая проблема. Есть простой XML-файлик следующего вида:
| Код | <?xml version="1.0" encoding="utf-8" ?> <Root> <TestNode>Данные</TestNode> <TestNode2>Данные 2</TestNode2> </Root>
|
Читать пытаюсь следующим кодом:
| Код | //XmlReader reader = XmlReader.Create(CurrentFile); <-- это делается в другой функции, отдельно, т.е. файл открыт постоянно string result = null; while (reader.Read()) if (reader.Name == node) { result = reader.ReadInnerXml(); break; } if (result == null) throw new Exception(String.Format("Node \"{0}\" not found.", node)); return result;
|
Но, если я попытаюсь сначала прочитать второй нод (TestNode2), а потом первый (TestNode), я получу свое исключение, что нод не найден. Я проверял, это возникает, по-видимому, потому, что указатель в ридере остается ниже нужного нода. Метод переоткрывать файл каждый раз - это как-то топорно, хоть и работает. Попробовал обойти проблему через файловый поток. Делаю так:
| Код | // перезагружаем файловый поток, если требуется открыть другой файл if ((_fs == null) || (Path.GetFileNameWithoutExtension(_fs.Name) != CurrentFile)) { _CloseFiles(); _fs = new FileStream(_files[CurrentFile], FileMode.Open, FileAccess.Read); _xmlReader = XmlReader.Create(_fs); } // ищем нужный нод и запоминаем его содержимое string result = null; while (_xmlReader.Read()) if (_xmlReader.Name == node) { result = _xmlReader.ReadInnerXml(); break; } _fs.Seek(0, SeekOrigin.Begin); // сдвигаемся обратно к началу файла <-- вот основное, на что я надеялся // если нод не найден, генерируем исключение if (result == null) throw new Exception(String.Format("Node \"{0}\" not found.", node)); return result;
|
Казалось бы, все должно быть правильно. В первый раз нод читается нормально (TestNode2 в нашем случае). Однако, после второй попытки чтения вышележащего нода TestNode я получаю исключение времени выполнения, что читаемый файл содержит ошибку в строке 5, позиция 11. Получаю это на строчке
| Код | while (_xmlReader.Read())
|
Вопрос: в чем проблема? Почему перенос указателя в потоке обратно не сработал, и как в данном случае следует правильно сделать? Задача вообще простая: XML-файл должен быть открыт на протяжении всего времени работы программы, и при запросе выдавать нужный нод оттуда. |