xml jaxb format line-breaks

Jaxb-Marshall-¿Cómo puedo formatear los atributos xml? Por ejemplo, poner un salto de línea después de cada atributo



line-breaks (3)

Este comportamiento no lo ofrecen las API JAXB (JSR-222) estándar. Dado que esto es solo por motivos estéticos, sugeriría que no vale la pena molestarse en lograrlo.

Si es algo que realmente debe tener, podría proporcionar una implementación de ContentHandler . Un ContentHandler recibirá todos los eventos XML y luego podrá controlar cómo se escriben en OutputStream o Writer subyacente. Tendrá que manejar toda la lógica de formateo, pero cuando ContentHandler a este ContentHandler obtendrá el formato exacto que está buscando.

Estoy tratando de encontrar una forma de formatear el xml para que cada atributo esté en una nueva línea.

código:

OutputFormat of = new OutputFormat(); of.setIndent(4); XMLSerializer serializer = new XMLSerializer(of); Writer stringWriter = new StringWriter(); serializer.setOutputCharStream(stringWriter); marshaller.marshal(target, serializer.asContentHandler()); results = stringWriter.toString();

Estoy tratando de obtener esto:

<blablabla isGood="false" newInstance="false" id="cse_a" deleted="false" name="cse_a" xmlns:blabla="http://www.blabla.com"> <Description><![CDATA[]]></Description> <Name><![CDATA[A]]></Name> </blablabla>

Para verse así:

<blablabla isGood="false" newInstance="false" id="cse_a" deleted="false" name="cse_a" xmlns:blabla="http://www.blabla.com"> <Description><![CDATA[]]></Description> <DisplayName><![CDATA[A]]></DisplayName> </blablabla>

¡Gracias!


Solo un ejemplo de la respuesta de Blaise Doughan, con ContentHandler:

import java.io.IOException; import java.io.Writer; import org.apache.commons.lang3.StringUtils; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class WriteOutContentHandler extends DefaultHandler { private static final String NEWLINE = System.getProperty("line.separator"); private static final String INDENT = " "; private Writer _writer; private int depth = 0; public WriteOutContentHandler(Writer writer) { _writer = writer; } @Override public void characters(char[] ch, int start, int length) throws SAXException { try { _writer.write(ch, start, length); } catch (IOException e) { throw new SAXException("Error writing out character content", e); } } @Override public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { try { _writer.write(ch, start, length); } catch (IOException e) { throw new SAXException("Error writing out character content", e); } } @Override public void endDocument() throws SAXException { try { _writer.flush(); } catch (IOException e) { throw new SAXException("Error flushing character output", e); } } @Override public String toString() { return _writer.toString(); } @Override public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { write(NEWLINE); write(StringUtils.repeat(INDENT, depth)); depth++; String eName = localName; if ("".equals(eName)) { eName = qName; } write("<" + eName); if (attrs != null) { for (int i = 0; i < attrs.getLength(); i++) { String attrName = attrs.getLocalName(i); if ("".equals(attrName)) { attrName = attrs.getQName(i); } write(NEWLINE); write(StringUtils.repeat(INDENT, depth)); write(attrName); write("=/""); write(attrs.getValue(i)); write("/""); } } if (attrs.getLength() > 0) { write(NEWLINE); write(StringUtils.repeat(INDENT, depth-1)); } write(">"); } @Override public void endElement(String namespaceURI, String sName, String qName) throws SAXException { write(NEWLINE); depth--; write(StringUtils.repeat(INDENT, depth)); String eName = sName; if ("".equals(eName)) { eName = qName; } write("</" + eName + ">"); } private void write(String s) throws SAXException { try { _writer.write(s); _writer.flush(); } catch (IOException e) { throw new SAXException("I/O error", e); } } }

Y el uso:

StringWriter writer = new StringWriter(); JAXBContext jc = JAXBContext.newInstance(MODEL); Marshaller marshaller = jc.createMarshaller(); marshaller.marshal(node, new WriteOutContentHandler(writer)); return writer.toString();


Un poco tarde, pero encontré una solución usando un formateador xml de código abierto llamado "DecentXML". Necesitó algunos cambios, pero en general una gran herramienta.

gracias a todos.