Решал сам, потом сверялся с решениями в комментах. Есть ощущение, что раньше решение проходило, но теперь что-то пошло не так.
package com.javarush.task.task33.task3309;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.crypto.dsig.Transform;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;
/*
Комментарий внутри xml
*/
public class Solution {
public static String toXmlWithComment(Object obj, String tagName, String comment) throws JAXBException, ParserConfigurationException, TransformerException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setCoalescing(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(obj, document);
NodeList allNodes = document.getDocumentElement().getElementsByTagName("*");
for (int i = 0; i < allNodes.getLength(); i++) {
Node node = allNodes.item(i);
if (node.getNodeName().equalsIgnoreCase(tagName)) {
Comment com = document.createComment(comment);
node.getParentNode().insertBefore(com, node);
}
if (node.getTextContent().matches(".*[<>&\'\"].*")) {
String text = node.getTextContent();
Node cdata = document.createCDATASection(text);
node.setTextContent(null);
node.appendChild(cdata);
}
}
StringWriter sw = new StringWriter();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.STANDALONE, "no");
transformer.transform(new DOMSource(document), new StreamResult(sw));
return sw.toString();
}
public static void main(String[] args) {
}
}
/*
public class Solution {
public static String toXmlWithComment(Object obj, String tagName, String comment) throws JAXBException, ParserConfigurationException, TransformerException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setCoalescing(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(obj, document);
NodeList allNodes = document.getDocumentElement().getElementsByTagName("*");
for (int i = 0; i < allNodes.getLength(); i++) {
Node node = allNodes.item(i);
if (node.getNodeName().equalsIgnoreCase(tagName)) {
Comment com = document.createComment(comment);
node.getParentNode().insertBefore(com, node);
}
if (node.getTextContent().matches(".*[<>&\'\"].*")) {
String text = node.getTextContent();
Node cdata = document.createCDATASection(text);
node.setTextContent(null);
node.appendChild(cdata);
}
}
StringWriter sw = new StringWriter();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.STANDALONE, "no");
transformer.transform(new DOMSource(document), new StreamResult(sw));
return sw.toString();
}
public static void main(String[] args) {
}
}
*/