¿Cómo puedo generar XML desde una jerarquía de objetos?
-
05-07-2019 - |
Pregunta
Tengo objeto , árbol / modelo / jerarquía, sea cual sea el término correcto. Consiste en lo que podría caracterizarse como una asignación uno a uno del XML deseado.
Eso es lo que tengo (en una sintaxis UML no estándar)
class A {
class B b[*]
class C
class D
}
class B {
class C c[*]
string AttributeFoo = "bar"
}
class C {
string AttributeThis = "is"
}
class D {
string AttributeName = "d"
}
La salida deseada es algo como esto:
<?xml version="1.0"?>
<a>
<b attribute-foo="bar">
<c attribute-this="is"/>
</b>
<c attribute-this="is"/>
<d attribute-name="d"/>
</a>
¿Qué propondría para ser el mejor y / o la manera más sencilla de lograr este objetivo?
Solución
Miraría a JAXB porque a) lo obtienes en la biblioteca estándar y b) no es tan complicado. Este código requiere Java 6:
@XmlRootElement public static class A {
public List<B> b = new ArrayList<B>();
}
public static class B {
public List<C> c = new ArrayList<C>();
@XmlAttribute(name = "attribute-foo") public String attributeFoo = "foo";
}
public static class C {
@XmlAttribute(name = "attribute-this") public String attributeThis = "is";
}
public static void main(String[] args) {
A a = new A();
a.b.add(new B());
a.b.get(0).c.add(new C());
JAXB.marshal(a, System.out);
}
//TODO: getters/setters, error handling and so on
Salida:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>
<b attribute-foo="foo">
<c attribute-this="is"/>
</b>
</a>
Otros consejos
Creo que es el propósito de JAXB ( http://jaxb.java.net/ ) para asignar objetos a / desde XML
Si desea utilizar herramientas, eche un vistazo a jaxb . Marshalling / Unmarshalling es lo que está haciendo aquí, es un problema común con muchas soluciones disponibles.
Creo que es lo mejor (no reinventar la rueda) y es lo más simple (lo he hecho manualmente y no es nada divertido; los gráficos de objetos pueden ser cíclicos ...)
Me gusta XMLBeans .
En mi opinión, si no te molesta demasiado el rendimiento, me mantendré alejado de Jaxb y echaré un vistazo a algunos de los marcos más simples. Si el rendimiento es un problema, tiendo a preferir jibx sobre jaxb para la mayoría de las situaciones.
En esta situación tiendo a usar el proyecto simple.
http://simple.sourceforge.net/download /stream/doc/tutorial/tutorial.php#start
Simplemente anota tu modelo de objeto y listo ... :-)
@Root
public class Example {
@Element
private String text;
@Attribute
private int index;
public Example() {
super();
}
public Example(String text, int index) {
this.text = text;
this.index = index;
}
public String getMessage() {
return text;
}
public int getId() {
return index;
}
}