Приношу извинения, если на этот вопрос был дан ответ, но используемые мной поисковые запросы (т. е. JAXB @XmlAttribute конденсированный или JAXB XML Marshal для различных результатов в строке) ничего не дали.
Я использую JAXB для демаршалинга объектов, аннотированных с помощью @XmlElement и аннотации @XmlAttribute. У меня есть класс форматтера, который предоставляет два метода: один оборачивает метод маршалирования и принимает объект для маршалирования и OutputStream, другой просто принимает объект и возвращает выходные данные XML в виде строки. К сожалению, эти методы не обеспечивают одинаковый результат для одних и тех же объектов. При маршалинге в файл поля простых объектов, внутренне помеченные @XmlAttribute, печатаются как:
при маршалинге в строку:
Я бы предпочел второй формат для обоих случаев, но мне интересно, как контролировать разницу, и я бы согласился на то, чтобы они были одинаковыми в любом случае. Я даже создал один статический маршаллер, который оба метода используют для исключения разных значений экземпляра. Код форматирования следующий:
/** 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;
}
Результат вызова marshal(container, new FileOutputStream("output.xml")) и marshalToString(container) следующий:
Вывод в файл
1
stackoverflow
и
Вывод в строку
1
stackoverflow
JAXB маршалирует XML иначе, чем OutputStream и StringWriter. ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1777477208
Anonymous
Приношу извинения, если на этот вопрос был дан ответ, но используемые мной поисковые запросы (т. е. [b]JAXB @XmlAttribute конденсированный[/b] или [b]JAXB XML Marshal для различных результатов в строке[/b]) ничего не дали.
Я использую JAXB для демаршалинга объектов, аннотированных с помощью @XmlElement и аннотации @XmlAttribute. У меня есть класс форматтера, который предоставляет два метода: один оборачивает метод маршалирования и принимает объект для маршалирования и OutputStream, другой просто принимает объект и возвращает выходные данные XML в виде строки. К сожалению, эти методы не обеспечивают одинаковый результат для одних и тех же объектов. При маршалинге в файл поля простых объектов, внутренне помеченные @XmlAttribute, печатаются как:
при маршалинге в строку:
Я бы предпочел второй формат для обоих случаев, но мне интересно, как контролировать разницу, и я бы согласился на то, чтобы они были одинаковыми в любом случае. Я даже создал один статический маршаллер, который оба метода используют для исключения разных значений экземпляра. Код форматирования следующий:
/** 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;
}
Результат вызова marshal(container, new FileOutputStream("output.xml")) и marshalToString(container) следующий:
[b]Вывод в файл[/b]
1
stackoverflow
и
[b]Вывод в строку[/b]
1
stackoverflow
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия