Анализатор XML обычно использует два этапа для обработки данных в документе.На первом этапе документ (который представляет собой последовательность байтов) декодируется в последовательность символов, которые помещаются во входной буфер.Фактический синтаксический анализ XML выполняется на втором этапе, на котором анализируются различные конструкции, такие как начальный и конечный теги элемента.Обратите внимание, что оба этапа выполняются параллельно.Точнее, входной буфер пополняется по требованию в процессе синтаксического анализа XML.Также обратите внимание, что если документ уже представлен в виде последовательности символов (например, с использованием StringReader
), то декодирование на первом этапе пропускается, но синтаксический анализатор все равно будет использовать входной буфер для хранения символов, считанных из потока.
Как отмечали другие, синтаксический анализатор SAX не обязан сообщать о текстовом узле как об одном фрагменте.Он может по своему усмотрению принять решение разделить узел на несколько частей.Это называется не-объединяющим синтаксическим анализом .
То, что вы называете «забавными символами», на самом деле являются ссылками на сущности символов (<и> в вашем случае).Они должны быть расшифрованы (в вашем случае «<» и «>») перед отправкой данных в приложение.Однако это можно сделать только на втором этапе.Причина в том, что та же последовательность символов (например, «<») может не нуждаться в декодировании, если она появляется в другом контексте, в частности в разделе CDATA. </p>
Дело в том, что если текстовый узел несодержат любые ссылки на сущности, тогда анализатор может передавать символьные данные непосредственно из входного буфера в приложение.Это увеличивает вероятность того, что весь текстовый узел сообщается как один фрагмент.Однако даже в этом случае возможно, что текстовый узел не полностью помещается во входной буфер, и в этом случае синтаксический анализатор сообщит об этом несколькими частями.
С другой стороны, если текстЕсли узел содержит ссылки на сущности, то синтаксический анализатор не может передать данные непосредственно из входного буфера в приложение, поскольку часть данных нуждается в дальнейшем декодировании.Чтобы избежать многократного копирования данных, большинство анализаторов предпочитают передавать части, которые не нуждаются в дальнейшем декодировании, непосредственно в приложение, в то время как ссылки на сущности сначала декодируются в отдельный буфер.Вот почему вы получаете фрагменты, которые в исходном документе разделены ссылками на сущности.