Как принудительно удалить атрибуты с подразумеваемыми значениями по умолчанию из DTD в Java XML DOM

Как я сообщал в другом месте на Stack Overflow, я анализирую устаревший модульный документ XHTML 1.1, и DTD добавляет всевозможные атрибуты по умолчанию, такие как version="-//W3C//DTD XHTML 1.1//EN". Некоторые из них даже неуместны, например xml:space="preserve".

Я пишу утилиту для очистки DOM после синтаксического анализа, но я забыл, что DOM автоматически вернет атрибуты по умолчанию из DTD, если я их удалю. Поэтому, если я вызываю Element.removeAttributeNS(null, "version") для элемента документа, например, он просто добавляет обратно version="-//W3C//DTD XHTML 1.1//EN", и я возвращаюсь к тому, с чего начал.

Как я могу заставить DOM в Java удалить атрибут, даже если DTD указывает, что атрибут имеет подразумеваемое значение? Или как я могу просто изменить/удалить DTD из дерева DOM, чтобы подразумеваемые атрибуты не отображались автоматически?

Мне удалось создать новый пустой документ без DTD; импорт старого элемента документа и его потомков; а затем заменить корневой элемент в новом документе импортированным деревом элементов, но это требует больших накладных расходов и слишком неэффективно. Есть ли более эффективный обходной путь или решение?


person Garret Wilson    schedule 14.03.2020    source источник
comment
Разве вы не можете просто разобрать без проверки?   -  person Michael Kay    schedule 15.03.2020
comment
Но я разбираю без проверки! См. код на странице stackoverflow.com/q/60603441/421049. (Проверка по умолчанию отключена.) Появляются ли значения по умолчанию в DOM из DTD, похоже, не связаны с проверкой. В конце концов, синтаксический анализатор должен анализировать и использовать DTD, даже если проверка отключена (например, для обнаружения объекта —); в противном случае документ может быть неправильно сформирован.   -  person Garret Wilson    schedule 15.03.2020