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