По условию принимаем на вход объект произвольного класса готового к сериализации в XML. Значения полей класса могут содержать подлежащие экранированию символы (< > " ' &) - в этом случае в зависимости от наличия аннотации @XmlCDATA, эти символы экранируются, либо все значение помещается в блок <![CDATA[ ... ]]>. Каждое значение находится внутри соответствующего тега на отдельной строке, но сами значения могут содержать перевод строки который не будет экранирован, а выведен "как есть", т.е. значение может занимать несколько строк. Если значение занимает несколько строк и находится внутри CDATA, то есть вероятность встретить внутри одной из строк подстроку идентичную тегу, но не являющуюся им. Методика решения: Обходим построчно результат сериализации: 1) Если строка после отбрасывания ведущих пробелов строка начинается с целевого тега и флаг открытого блока CDATA не установлен, пишем в результат комментарий. 2) Если в строке открывается блок CDATA, устанавливаем соответствующий флаг 3) Если в строке закрывается блок CDATA, снимаем соответствующий флаг 4) Пишем в результат текущую строку Вот из такого:
Получается:
Что еще валидатор хочет такого, что может встретиться в XML сформированным JAXB?