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.