Ten en cuenta que en la informática cualquier problema puede tener diferentes resoluciones, no obstante nosotros enseñaremos lo más óptimo y mejor.
Solución:
Básicamente, desea un nodo de texto que contenga un salto de línea después del nodo de comentario.
Element docElem = doc.getDocumentElement();
doc.insertBefore(doc.createComment("DO NOT EDIT THIS FILE"), docElem);
doc.insertBefore(doc.createTextNode("\n"), docElem);
EDITAR: Parece que no se permite agregar ni siquiera los nodos de texto de solo espacios en blanco en el nodo raíz de un org.w3c.dom.Document
. Esto es 100% formalmente correcto, pero también inútil.
La forma en que se representan los comentarios en la salida del Transformer
está determinado por el serializador que utiliza (existen diferentes serializadores para salidas de texto sin formato, HTML y XML). En el serializador XML incorporado, el final de un comentario se define como -->
– sin una nueva línea.
Dado que el interior de javax.xml.transform.Transformer
están cableados, los serializadores no son una API pública y la clase está marcada como final
anular ese comportamiento o configurar un serializador personalizado es imposible.
En otras palabras, no tiene suerte al agregar su salto de línea en un limpio camino.
Sin embargo, puede agregarlo de forma segura de una manera un poco sucia:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
FileInputStream inputXml = new FileInputStream(new File("input.xml"));
Document doc = db.parse(inputXml);
// add the comment node
doc.insertBefore(doc.createComment("THIS IS A COMMENT"), doc.getDocumentElement());
StringWriter outputXmlStringWriter = new StringWriter();
Transformer transformer = transformerFactory.newTransformer();
// "xml" + "UTF-8" "include XML declaration" is the default anyway, but let's be explicit
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new DOMSource(doc), new StreamResult(outputXmlStringWriter));
// now insert our newline into the string & write an UTF-8 file
String outputXmlString = outputXmlStringWriter.toString()
.replaceFirst("", "-->n");
FileOutputStream outputXml = new FileOutputStream(new File("output.xml"));
outputXml.write(outputXmlString.getBytes("UTF-8"));
En general, se desaconseja encarecidamente realizar operaciones de búsqueda y reemplazo en cadenas XML, pero en este caso hay pocas cosas que puedan salir mal.
Revisando esto después de un tiempo porque tuve el mismo problema. Encontré otra solución que no necesita almacenar en búfer la salida en una cadena:
-
Escriba solo la declaración XML pasando un documento vacío. Esto también agregará un salto de línea.
-
Escriba el contenido del documento sin declaración XML
Código:
StreamResult streamResult = new StreamResult(writer);
// output XML declaration with an empty document
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.transform(new DOMSource(), streamResult);
// output the document without XML declaration
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(doc), streamResult);
Te invitamos a añadir valor a nuestro contenido contribuyendo tu experiencia en las referencias.