Столкнулся с ошибкой и не пойму из-за чего такое поведение.
Есть простой код:
var nDoc = new XmlDocument {PreserveWhitespace = true};
StreamReader reader = File.OpenText(fileName);
nDoc.Load(reader); // <-- тут вылетает ошибка
Загружается нормальный xml-файл без BOM.
Если вызов этого метода идет из конструктора формы или из OnLoad, то возникает ошибка: Data at the root level is invalid. Line 1, position 1.
Если же вызывается метод с этим кодом по нажатию кнопки на форме, то ошибки нет.
При вызове как nDoc.Load(fileName) то же самое.
Все что нашел в интернете сводится к тому, что в файле присутствует BOM и его надо удалить, но его там нет, да и по кнопке все работает как часы. Файл сам формируется через программу, руками туда не лазили.
Что с этим делать и почему разное поведение при вызове из разных мест программы? Вызов при старте нужен при запуске программы с параметром.
Здравствуйте, Basker, Вы писали:
B>Что с этим делать и почему разное поведение при вызове из разных мест программы? Вызов при старте нужен при запуске программы с параметром.
Вариант 0 — заменить на XDocument.
Вариант 1 — передавать в Load Stream, а не StreamReader.
Вариант 2 — пример с проблемой в студию). Есть у меня подозрение, что проблема не в самом XmlDocument.
Здравствуйте, Basker, Вы писали:
B>Столкнулся с ошибкой и не пойму из-за чего такое поведение. B>Есть простой код: B>
B>var nDoc = new XmlDocument {PreserveWhitespace = true};
B>StreamReader reader = File.OpenText(fileName);
B>nDoc.Load(reader); // <-- тут вылетает ошибка
B>
B>Загружается нормальный xml-файл без BOM.
Код содержит типовую ошибку: двойное декодирование: сначала из файла в строку (так как StreamReader читает строки), потом из строки в DOM.
При таком подходе нужно тщательно подбирать кодировки, чтобы совпадали с реальными на каждом этапе (OpenText использует UTF-8, вроде бы).
Правильный путь — отдавать парсеру исходные бинарные данные, он их и разберёт строго по спецификации и не будет лишних преобразований и потерь времени и памяти.
Если нужно загрузить из файла — отдавайте в Load() бинарный поток (из File.OpenRead()) или просто путь к файлу.
B>Если вызов этого метода идет из конструктора формы или из OnLoad, то возникает ошибка: Data at the root level is invalid. Line 1, position 1. B>Если же вызывается метод с этим кодом по нажатию кнопки на форме, то ошибки нет. B>При вызове как nDoc.Load(fileName) то же самое.
Вот почему разное поведение — непонятно
B>Все что нашел в интернете сводится к тому, что в файле присутствует BOM и его надо удалить,
Не читайте интернет! Там много глупостей пишут. Все парсеры отлично понимают BOM. если им не мешать.
Здравствуйте, vmpire, Вы писали:
B>>Если вызов этого метода идет из конструктора формы или из OnLoad, то возникает ошибка: Data at the root level is invalid. Line 1, position 1. B>>Если же вызывается метод с этим кодом по нажатию кнопки на форме, то ошибки нет. B>>При вызове как nDoc.Load(fileName) то же самое. V>Вот почему разное поведение — непонятно
Возможно связано с локализацией и currentculture всякой -- форма может использовать одно, а консоль другое.
Кодом людям нужно помогать!
Re[3]: Ошибка при считывании xml-файла в XmlDocument
Здравствуйте, Sharov, Вы писали:
V>>Вот почему разное поведение — непонятно S>Возможно связано с локализацией и currentculture всякой -- форма может использовать одно, а консоль другое.
Навряд ли, не должна локализация влиять на парсинг.
Re[2]: Ошибка при считывании xml-файла в XmlDocument
V>Если нужно загрузить из файла — отдавайте в Load() бинарный поток (из File.OpenRead()) или просто путь к файлу.
так было с самого начала. С OpenText() вариант возник уже позднее.
B>>Все что нашел в интернете сводится к тому, что в файле присутствует BOM и его надо удалить, V>Не читайте интернет! Там много глупостей пишут. Все парсеры отлично понимают BOM. если им не мешать.
Попробую проверить корректность файла и заголовков.
Re[2]: Ошибка при считывании xml-файла в XmlDocument
Всем большое спасибо и мои извинения за беспокойство. Я просто тормоз!!! Ночами спать надо. Не тот параметр приходил, ошибка была совсем в другом месте. Все заработало. Еще раз большое всем спасибо!!!