XmlTextReader передает конец XML-документа без распознавания - PullRequest
3 голосов
/ 28 января 2011

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

При входе в мою функцию чтения поток правильно позиционируется в начале 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, но это также не удалось.

Большое спасибо заранее, Cheers,

Romout

1 Ответ

0 голосов
/ 28 января 2011

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

reader.IsStartElement("Models");,

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

...