Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: XmlDocument.LoadXml ошибка парсинга строки  (Прочитано 6374 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 06-07-2006 15:47 » 

Загружаем XML документы. Документы правильные (верифицированные). Для загрузки используем методы Load или LoadXml объекта XmlDocument.

По крайней мере в .NET 1.1 (в остальных не проверял) при загрузке XML документов из строк иногда возникает ошибка парсинга "The data at the root level is invalid. Line 1, position 1". Внешних причин возникновения ошибки пока установить не удалось. Известно, что ошибка может возникнуть на тех документах, которые ранее успешно загружались, а потом может исчезнуть. Известно, что такое изменение происходит лишь после сохранения документов (даже если их содержание не изменялось). Жаль

В инете говорят, что такая ошибка возникает лишь в методе LoadXml, а метод Load, если ему передать какой-нибудь TextReader, исключения с этой ошибкой не вызывает - так этот баг (или фича) лечится.

Провёл серию экспериментов, которая показала, что оба метода генерируют ошибку при загрузки XML из строк, при загрузке тех же XML из файлов ошибка не возникает. По стеку видно, что ошибку генерирует XmlValidatingReader, в который обёртывается любой TextReader, попадающий на вход Load, а LoadXml создаёт StringReader для чтения строки.

По задаче я получаю XML от web-сервиса как массив байтов (byte[]), который через Encoding преобразую в строку. Содержание этой строки не воспринимается как XML. Однако, если эту строчку сохранить в файл на диск, и загружать её из файла StreamReader'ом, тогда XML загружается успешно. Жаль Такое решение со временным файлом для web-приложения неприемлимо по множеству причин.

Кто знает, как победить XmlDocument и заставить его загружать XML из строки?
« Последнее редактирование: 14-12-2007 23:20 от Алексей1153++ » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 12-07-2006 09:32 » 

Победил баг.

Изначально был код по такой схеме:
Код: (Text)
// Получаю массив байтов.
byte[] rd = ... ;

// Преобразую массив байтов в строку.
UTF8Encoding e = new UTF8Encoding(true, true);
string rxml = e.GetString(rd);

// Загружаю XML.
XmlDocument r = new XmlDocument();
r.LoadXml(rxml);
На этом оно валилось.

Нашёл подходящего читателя потока, не требующего файла и заменил код на следующую схему:
Код: (Text)
// Получаю массив байтов.
byte[] rd = ... ;

// Создаю читателя потока.
MemoryReader mr = new MemoryReader(rd);

// Загружаю XML.
XmlDocument r = new XmlDocument();
r.Load(mr);
Это читает любой XML в любой входной кодировке.

Почему он отказывался читать строчки или работать со StringReader, так и не понял. Жаль
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 12-07-2006 09:37 » 

Да, ещё такой момент. Глюк наблюдался только в случае входного UTF-8, в других кодировках XML грузился из строчки нормально.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines