Ошибка при считывании xml-файла в XmlDocument
От: Basker  
Дата: 05.02.17 20:45
Оценка:
Столкнулся с ошибкой и не пойму из-за чего такое поведение.
Есть простой код:
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 и его надо удалить, но его там нет, да и по кнопке все работает как часы. Файл сам формируется через программу, руками туда не лазили.
Что с этим делать и почему разное поведение при вызове из разных мест программы? Вызов при старте нужен при запуске программы с параметром.
Re: Ошибка при считывании xml-файла в XmlDocument
От: Sinix  
Дата: 06.02.17 05:59
Оценка:
Здравствуйте, Basker, Вы писали:

B>Что с этим делать и почему разное поведение при вызове из разных мест программы? Вызов при старте нужен при запуске программы с параметром.


Вариант 0 — заменить на XDocument.
Вариант 1 — передавать в Load Stream, а не StreamReader.
Вариант 2 — пример с проблемой в студию). Есть у меня подозрение, что проблема не в самом XmlDocument.
Re: Ошибка при считывании xml-файла в XmlDocument
От: vorona  
Дата: 06.02.17 08:05
Оценка: +1
Здравствуйте, Basker, Вы писали:

У меня был похожая проблема из-за Xml declaration
Re: Ошибка при считывании xml-файла в XmlDocument
От: vmpire Россия  
Дата: 06.02.17 08:35
Оценка: 6 (1) +1
Здравствуйте, 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. если им не мешать.
Отредактировано 06.02.2017 14:17 vmpire . Предыдущая версия .
Re[2]: Ошибка при считывании xml-файла в XmlDocument
От: Sharov Россия  
Дата: 06.02.17 10:27
Оценка:
Здравствуйте, 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
От: vmpire Россия  
Дата: 06.02.17 11:39
Оценка:
Здравствуйте, Sharov, Вы писали:

V>>Вот почему разное поведение — непонятно

S>Возможно связано с локализацией и currentculture всякой -- форма может использовать одно, а консоль другое.
Навряд ли, не должна локализация влиять на парсинг.
Re[2]: Ошибка при считывании xml-файла в XmlDocument
От: Basker  
Дата: 06.02.17 17:15
Оценка:
Здравствуйте, vmpire, Вы писали:


V>Если нужно загрузить из файла — отдавайте в Load() бинарный поток (из File.OpenRead()) или просто путь к файлу.

так было с самого начала. С OpenText() вариант возник уже позднее.

B>>Все что нашел в интернете сводится к тому, что в файле присутствует BOM и его надо удалить,

V>Не читайте интернет! Там много глупостей пишут. Все парсеры отлично понимают BOM. если им не мешать.
Попробую проверить корректность файла и заголовков.
Re[2]: Ошибка при считывании xml-файла в XmlDocument
От: Basker  
Дата: 06.02.17 17:16
Оценка:
Здравствуйте, vorona, Вы писали:

V>Здравствуйте, Basker, Вы писали:


V>У меня был похожая проблема из-за Xml declaration

V>

Спасибо, попробую это проверить. Думаю я где-то все же протупил.
Re: Ошибка при считывании xml-файла в XmlDocument
От: Basker  
Дата: 06.02.17 17:45
Оценка: +1
Всем большое спасибо и мои извинения за беспокойство. Я просто тормоз!!! Ночами спать надо. Не тот параметр приходил, ошибка была совсем в другом месте. Все заработало. Еще раз большое всем спасибо!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.