Информация об изменениях

Сообщение Re: Ошибка при считывании xml-файла в XmlDocument от 06.02.2017 8:35

Изменено 06.02.2017 14:17 vmpire

Re: Ошибка при считывании xml-файла в 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 и его надо удалить,

Не читайте интернет! Там много глупостей пишут. Все парсеры отлично понимают DOM. если им не мешать.
Re: Ошибка при считывании xml-файла в 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. если им не мешать.