Добрый день всем!
Что-то упускаю в методах работы с DOM моделью видимо, но глаз уже "замылен" и не вижу что именно.
То есть:
1. почему-то между всеми элементами xml проставлены лишние переводы строки
2. почему-то перед самозакрывающимся тегом комментарий вставился 2 раза
Прошу помощи!
package com.javarush.task.task33.task3309;
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.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.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Date;
/*
Комментарий внутри xml
*/
public class Solution {
public static String toXmlWithComment(Object obj, String tagName, String comment) throws ParserConfigurationException, JAXBException, IOException, SAXException, TransformerException {
StringWriter writer = new StringWriter();
/*
writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" +
"<first>\n" +
"<!--it's a comment-->\n" +
"<second>some string</second>\n" +
"<!--it's a comment-->\n" +
"<second>some string</second>\n" +
"<!--it's a comment-->\n" +
"<second><![CDATA[need CDATA because of < and >]]></second>\n" +
"<!--it's a comment-->\n" +
"<second/>\n" +
"</first>\n" +
"\n");
*/
// Получается xml представление obj
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(obj, writer);
// Подготавливается парсер dom
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(writer.toString().getBytes()));
Node commentNode = document.createComment(comment);
NodeList elements = document.getElementsByTagName(tagName);
for (int i = 0; i < elements.getLength(); i++) {
Node parentElem = elements.item(i).getParentNode();
parentElem.insertBefore(commentNode, elements.item(i));
// elements.item(i).insertBefore(commentNode, null);
}
// Подготавливается преобразование dom-представления в текстовый вид
TransformerFactory transformerFactory = TransformerFactory.newInstance();
transformerFactory.setAttribute("indent-number", 4);
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.STANDALONE, "no");
StringWriter ret = new StringWriter();
StreamResult sr = new StreamResult(ret);
DOMSource source = new DOMSource(document);
transformer.transform(source, sr);
return sr.getWriter().toString();
}
public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException, JAXBException, TransformerException {
System.out.println(toXmlWithComment(new Date(), "second", "it's a comment"));
}
}