Comment pourrais-je le maréchal une Liste de Jaxb Éléments sans en faire une classe wrapper?
Court d'en faire réellement un écrivain et ajoutant chaque élément sur la chaîne. Est-il possible d'obtenir le JAXB marshaller au maréchal une liste d'objets où je peux juste lui donner le nom de l'élément supérieur?
Je sens que je suis proche avec cette
//http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html
public <T> String jaxb(Collection<T> o, Class<T> clazz, String plural){
try {
ArrayList<T> al = new ArrayList<T>(o.size());
al.addAll(o);
JAXBContext jc = JAXBContext.newInstance(ArrayList.class);
JAXBElement<ArrayList> amenity = new JAXBElement(new QName(plural), ArrayList.class, al);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter writer = new StringWriter();
marshaller.marshal(amenity, writer);
return writer.toString();
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
mais le résultat est toujours de revenir une liste vide
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pluralName/>
Est-il un moyen de le faire sans coller manuellement les chaînes de xml ensemble?
Mise à jour
Avec l'aide de Michael Glavassevich j'ai été capable de le faire avec une mise en garde, tous les éléments sont <Item>
s
//http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T> String jaxb(Collection<T> elements, Class<T> elementClass, String plural){
try {
T[] array = (T[]) Array.newInstance(elementClass, elements.size());
elements.toArray(array);
JAXBContext jc = JAXBContext.newInstance(array.getClass());
JAXBElement<T[]> topElement = new JAXBElement(new QName(plural), array.getClass(), array);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter writer = new StringWriter();
marshaller.marshal(topElement, writer);
return writer.toString();
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
Le résultat devient alors
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Basketballs>
<item>basketball one</item>
<item>basketball two</item>
</Basketballs>
OriginalL'auteur mike | 2016-02-16
Vous devez vous connecter pour publier un commentaire.
Si vous ne voulez pas créer une classe wrapper vous pouvez convertir la collection dans un tableau, placez la pile dans un
JAXBElement
et puis maréchal.Par exemple:
qui produit le document suivant:
JAXBContext.newInstance()
si je ne connais pas le type? J'ai apparemment ne peut pas faireJAXBContext.newInstance(T[].class)
en fait, jamais l'esprit que j'ai pensé à elle. J'ai un autre problème. Si je change la classe de l'Élément nom à quelque chose comme le Basket-ball dans votre démonstration. Les différents éléments viennent encore comme
<item>
. Aucune idée comment faire pour changer cela?Semble être lié à la cartographie des règles pour les tableaux multidimensionnels, équivalent à un type de schéma avec
<xs:element name="item" type=schematype minOccurs="0" maxOccurs="unbounded" nillable="true"/>
. Au moins à la spécification de niveau ce n'est pas configurable.Quels sont les changements nécessaires dans la méthode ci-dessus pour générer du JSON au lieu de XML
OriginalL'auteur Michael Glavassevich
Veuillez essayer ceci:
Tout d'abord, créez une liste de classe:
puis l'Agrément de la classe:
ensemble en cas de besoin de vos équipements dans une liste - peut-être de moins en moins redondant 🙂 - et l'affecter à un AmenityList:
et enfin, une méthode toXml:
obtenir, c'est à dire :
OriginalL'auteur jenjis
La solution retenue avec l'ensemble des œuvres, mais des causes de chaque intérieur d'un élément nommé : < item >
La solution suivante prises à partir de ce lien a mieux fonctionné pour moi:
Est-il possible de configurer par programme JAXB?
}
Il ne nécessite pas de conversion de la liste à un tableau, mais nécessite 1 générique à usage général de la classe.
OriginalL'auteur Gonen I