2009-03-02 8 views
12

Ich habe Java-Klassen mit der folgenden Struktur (die Klassennamen implizieren nichts, ich habe sie nur erfunden).JAXB XML-Ausgabeformat Fragen

Das Problem, das ich habe, ist mit der XML-Ausgabe, die von JAXB beim Marshalling einer Test-Instanz generiert wird. Die XML-Ausgabe aussehen würde immer wie folgt aus:

<?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> 

Wie Sie sehen können, sind einige Elemente nicht richtig eingezogen werden (das heißt, die tiefste Elemente, zählen und Zeit). Warum das? Ist etwas falsch mit der Art, wie ich den JAXB-Kontext erstellt habe? Oder gibt es eine Obergrenze für die Anzahl der Elemente, die von JAXB rekursiv eingerückt werden können? Wie könnte ich das beheben? Beachten Sie, dass ich auch JAXB_FORMATTED_OUTPUT auf True festgelegt habe, aber immer noch den falschen Einzug erhalten.

Danke.

+0

Konnten Sie das auflösen? Ich habe auch das gleiche Problem in meinem XML generiert mit JAXB. Könnten Sie mir bitte einen Ratschlag geben ? –

+0

@ shivam-shekhar, nein, Problem ist immer noch da :(aber es ist weniger wichtig im Vergleich zu anderen Dingen, so dass wir es einfach dort gelassen – His

Antwort

9

Einrücken tritt Modulo 8, in

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

finden Sie

int i = depth%8; 
+1

Dieses Problem ist einzigartig für die Metro-Implementierung von JAXB (RI). Andere Implementierungen von JAXB wie wie MOXy dieses Problem nicht teilen: http://www.eclipse.org/eclipselink/moxy.php –

1

Ich glaube nicht, dass es eine Grenze gibt. Ich habe sehr tiefes Nisten gesehen, ohne irgendwelche Schwierigkeiten. Haben Sie eine Whitespace-Kontrolle? Außerdem haben Sie nicht die Definition der RateThreshold-Klasse angegeben, die die unerwartete Ausgabe erstellt.

0

Sie müssen die Linienbreite einstellen - default 72.

Output von = new Output ist();

of.setLineWidth (1000);

2

Eine der Überladungen der marshal()-Methode des Marshallers akzeptiert einen XMLStreamWriter, sodass Sie den hirngeschädigten Formatierungsmechanismus der Referenzimplementierung von JAXB umgehen können, indem Sie Ihren eigenen XML-Stream-Writer schreiben. Sie würden am Ende so etwas tun:

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); 
}