Przepraszam jeśli to zostało odebrane, ale warunki wyszukiwania używam (tj JAXB @XmlAttribute skondensowane lub JAXB XML marszałka na ciąg różnych wyników) nie wymyślają niczego.JAXB Marszałków XML inaczej OutputStream vs. StringWriter
Używam JAXB do usuwania/oznaczania obiektów adnotowanych adnotacjami @XmlElement
i @XmlAttribute
. Mam klasę formatyzatora, która zapewnia dwie metody - jedna opakowuje metodę marshal i akceptuje obiekt do marszałka i OutputStream
, druga po prostu akceptuje obiekt i zwraca wynik XML jako ciąg. Niestety, metody te nie zapewniają tego samego wyjścia dla tych samych obiektów. Kiedy Organizowanie do pliku, proste pól obiektu wewnętrznie oznaczone @XmlAttribute
są drukowane jako:
<element value="VALUE"></element>
chwili gdy Organizowanie do String, są to:
<element value="VALUE"/>
wolałbym drugi format obu przypadkach , ale jestem ciekawy, jak kontrolować różnicę i zadowalałoby to, że są tacy sami niezależnie. Stworzyłem nawet jednego statycznego koordynatora, którego używają obie metody do eliminowania różnych wartości instancji. Kod formatowania następująco:
/** 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;
}
podstawniki R esult wywoływania marshal(container, new FileOutputStream("output.xml"))
i marshalToString(container)
są następujące:
wyjściowe do pliku
<?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>
i
wyjście do 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>
Dziękuję za czyszczenie, że się trochę, miałem problemy nie mający XML interpretowane. – Andy
Dalsze badania wykazały, że to, czego szukam, to możliwość kontrolowania, czy JAXB zapisuje "puste elementy" w stylu HTML (sparowane tagi) lub XML (pojedynczy tag). W innych dostawcach JAXB, takich jak JaxMe, jest to właściwość, którą można ustawić, ale najwyraźniej nie w JAXB. Zastanawiam się tylko, dlaczego jest różny w zależności od typu miejsca docelowego. Wiem, że są one funkcjonalnie równoważne, ale potrzebuję ich, aby były identyczne do pracy z naszym systemem. Jakieś pomysły? – Andy