ich entschuldige mich, wenn diese beantwortet wurde, aber die Suchbegriffe Ich habe mit (dh JAXB @XmlAttribute kondensiert oder JAXB XML Marschall String unterschiedliche Ergebnisse) kommen mit nichts auf.JAXB Marschälle XML anders vs. String zu Output
ich JAXB bin mit der UN/Marschall-Objekte mit @XmlElement
und @XmlAttribute
Anmerkungen kommentiert. Ich habe eine Formatierungsklasse, die zwei Methoden bietet - eine umschließt die Marshal-Methode und akzeptiert das zu marshallende Objekt und eine OutputStream
, die andere akzeptiert das Objekt und gibt die XML-Ausgabe als String zurück. Leider bieten diese Methoden nicht dieselbe Ausgabe für dieselben Objekte. Wenn in einer Datei Marshalling, einfache Objektfelder intern mit @XmlAttribute
markiert sind, gedruckt wie:
<element value="VALUE"></element>
während, wenn in einen String Marshalling, sie sind:
<element value="VALUE"/>
Ich würde das zweite Format für beide Fälle bevorzugen , aber ich bin neugierig, wie ich den Unterschied kontrollieren kann, und ich würde mich damit begnügen, dass sie immer gleich sind. Ich habe sogar einen statischen Marshaller erstellt, den beide Methoden verwenden, um verschiedene Instanzwerte zu eliminieren. Die Formatierungscode folgt:
/** Marker interface for classes which are listed in jaxb.index */
public interface Marshalable {}
/** Local exception class */
public class XMLMarshalException extends BaseException {}
/** Class which un/marshals objects to XML */
public class XmlFormatter {
private static Marshaller marshaller = null;
private static Unmarshaller unmarshaller = null;
static {
try {
JAXBContext context = JAXBContext.newInstance("path.to.package");
marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
unmarshaller = context.createUnmarshaller();
} catch (JAXBException e) {
throw new RuntimeException("There was a problem creating a JAXBContext object for formatting the object to XML.");
}
}
public void marshal(Marshalable obj, OutputStream os) throws XMLMarshalException {
try {
marshaller.marshal(obj, os);
} catch (JAXBException jaxbe) {
throw new XMLMarshalException(jaxbe);
}
}
public String marshalToString(Marshalable obj) throws XMLMarshalException {
try {
StringWriter sw = new StringWriter();
return marshaller.marshal(obj, sw);
} catch (JAXBException jaxbe) {
throw new XMLMarshalException(jaxbe);
}
}
}
/** Example data */
@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
public class Data {
@XmlAttribute(name = value)
private String internalString;
}
/** Example POJO */
@XmlType
@XmlRootElement(namespace = "project/schema")
@XmlAccessorType(XmlAccessType.FIELD)
public class Container implements Marshalable {
@XmlElement(required = false, nillable = true)
private int number;
@XmlElement(required = false, nillable = true)
private String word;
@XmlElement(required = false, nillable = true)
private Data data;
}
Die r eiter marshal(container, new FileOutputStream("output.xml"))
und marshalToString(container)
Aufruf sind wie folgt:
Ausgabe
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:container xmlns:ns2="project/schema">
<number>1</number>
<word>stackoverflow</word>
<data value="This is internal"></data>
</ns2:container>
und
Ausgabe auf String
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:container xmlns:ns2="project/schema">
<number>1</number>
<word>stackoverflow</word>
<data value="This is internal"/>
</ns2:container>
Danke, dass für die Reinigung ein wenig, hatte ich Schwierigkeiten nicht den XML interpretiert hat. – Andy
Weitere Untersuchungen haben gezeigt, dass ich nach der Möglichkeit suche zu kontrollieren, ob JAXB "leere Elemente" in HTML (gepaarte Tags) oder XML (Single Tag) schreibt. In anderen JAXB-Anbietern wie JaxMe ist dies eine Eigenschaft, die gesetzt werden kann, aber anscheinend nicht in JAXB. Ich frage mich nur, warum es je nach Zieltyp unterschiedlich ist. Ich weiß, dass sie funktional gleichwertig sind, aber ich brauche sie, um mit unserem System zu arbeiten. Irgendwelche Ideen? – Andy