XmlTextReader передает конец документа XML без распознавания

Я пытаюсь создать простое приложение, которое читает XML с помощью SAX (XmlTextReader) из потока, который содержит не только XML, но и другие данные, такие как двоичные BLOB-объекты и текст. Структура потока просто основана на фрагментах.

При входе в мою функцию чтения поток правильно позиционируется в начале XML. Я сократил проблему до следующего примера кода:

string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?><Models />" + (char)0x014;

XmlTextReader reader = new XmlTextReader(new StringReader(xml));
reader.MoveToContent();
reader.ReadStartElement("Models");

Эти несколько строк вызывают исключение при вызове ReadStartElement из-за 0x014 в конце строки.

Самое интересное в этом то, что код работает нормально при использовании вместо этого следующего ввода:

string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?><Models></Models>" + (char)0x014;

Я не хочу читать весь документ из-за его размера и не хочу менять ввод, поскольку мне нужно оставаться обратно совместимым со старыми вводами данных.

Единственное решение, которое я могу придумать на первый взгляд, — это пользовательский потоковый ридер, который не продолжает чтение после последнего закрывающего тега, но это потребует значительных усилий по синтаксическому анализу.

Есть ли у вас какие-либо идеи о том, как решить эту проблему? Я уже пытался использовать XDocument LINQ, но это тоже не удалось.

Заранее большое спасибо, Ура,

Роут


person Romout    schedule 28.01.2011    source источник
comment
Кстати, вы не должны использовать new XmlTextReader(). Он устарел, начиная с .NET 2.0. Вместо этого используйте XmlWriter.Create().   -  person John Saunders    schedule 28.01.2011
comment
Кроме того, есть ли мысли предоставить вам разумные данные? Смешивание двоичного и текстового (XML) не имеет особого смысла, если вы не можете идентифицировать блоки XML на основе заголовка или чего-то еще.   -  person John Saunders    schedule 28.01.2011
comment
Наконец-то мы перешли к использованию дополнительной информации заголовка для извлечения XML-данных из потока перед его окончательным разбором. Этот подход работает хорошо и, как ни странно, совместим с предыдущими версиями.   -  person Romout    schedule 03.03.2011


Ответы (1)


Я не знаю, действительно ли это то, что вы ищете, но если вместо этого вы позвоните:

reader.IsStartElement("Models");,

чем узел <Models/> будет проверен только в том случае, если это начальный тег или тег пустого элемента и если имя совпадает. Читатель не будет перемещен за его пределы (метод Read() не будет вызываться).

person Edwin de Koning    schedule 28.01.2011