Question

J'ai des classes Java avec la structure suivante (les noms de classes n'impliquent rien, je les inventais).

package test;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlRootElement
public class Test
{
    @XmlAccessorType(XmlAccessType.FIELD)
    static class Machine
    {
        @XmlElementWrapper(name="servers")
        @XmlElement(name="server")
        List<Server> servers = new ArrayList<Server>();
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    static class Server
    {
        Threshold t = new Threshold();
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    static class Threshold
    {
        RateThreshold load = new RateThreshold();
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    static class RateThreshold
    {
        @XmlAccessorType(XmlAccessType.FIELD)
        static class Rate
        {
            int count;
            Period period = new Period();
        }

        @XmlAccessorType(XmlAccessType.FIELD)
        private static class Period
        {
            @XmlAttribute
            private String type = "second";

            @XmlValue
            private float period;
        }

        Rate min = new Rate();
        Rate max = new Rate();
    }

    @XmlElementWrapper(name="machines")
    @XmlElement(name="machine")
    List<Machine> machines = new ArrayList<Machine>();

    public static void main(String[] args)
    {
        Machine m = new Machine();
        Server s = new Server();
        s.t.load.max.count = 10;
        s.t.load.min.count = 1;
        m.servers.add(s);

        Test t = new Test();
        t.machines.add(m);

        JAXBContext jaxbContext;
        Marshaller marshaller;
        try
        {
            jaxbContext = JAXBContext.newInstance(Test.class);
            marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(t, System.out);
        }
        catch (JAXBException e)
        {
            e.printStackTrace();
        }
    }
}

Le problème que je rencontre concerne la sortie XML générée par JAXB lors du rassemblement d’une instance de test. La sortie XML ressemblerait toujours à ce qui suit:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<test>
    <machines>
        <machine>
            <servers>
                <server>
                    <t>
                        <load>
                            <min>
<count>1</count>
<period type="second">0.0</period>
                            </min>
                            <max>
<count>10</count>
<period type="second">0.0</period>
                            </max>
                        </load>
                    </t>
                </server>
            </servers>
        </machine>
    </machines>
</test>

Comme vous pouvez le constater, certains éléments ne sont pas indentés correctement (c’est-à-dire les éléments les plus profonds, le nombre et la période). Pourquoi donc? Quelque chose ne va pas dans la manière dont j'ai créé le contexte JAXB? Ou existe-t-il une limite maximale au nombre d'éléments pouvant être indentés récursivement par JAXB? Comment pourrais-je résoudre ce problème? Notez que j’ai également défini JAXB_FORMATTED_OUTPUT sur true, mais que l’indentation n’est toujours pas correcte.

Merci.

Était-ce utile?

La solution

L'indentation se produit modulo 8, dans

com.sun.xml.bind.v2.runtime.output.IndentingUTF8XmlOutput

vous trouvez

int i = depth%8;

Autres conseils

L'une des surcharges de la méthode marshal () du marshaler accepte un XMLStreamWriter afin que vous puissiez contourner le mécanisme de formatage endommagé par le cerveau de l'implémentation de référence de JAXB en écrivant votre propre flux XML de formatage. écrivain. Vous finirez par faire quelque chose comme ceci:

public static void SaveContainer( Container container, OutputStream stream ) throws ...
{
    XMLOutputFactory factory = XMLOutputFactory.newInstance();
    XMLStreamWriter writer = factory.createXMLStreamWriter( stream, "UTF-8" );
    writer = new MyAwesomeCoolFormattingXMLStreamWriter( writer );
    marshaller.marshal( container, writer );
}

Je ne pense pas qu'il y ait une limite. J'ai vu nidification très profonde, sans aucune difficulté. Avez-vous un contrôle d'espaces en place? De plus, vous n'avez pas fourni la définition de la classe RateThreshold, qui est celle qui crée la sortie inattendue.

Vous devez définir la largeur de ligne - la valeur par défaut est 72.

OutputFormat of = new OutputFormat ();

of.setLineWidth (1000);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top