Как преобразовать список POJO в элементы XML

Я использую Spring Boot и хочу преобразовать POJO в XML. Каков самый простой способ сделать это?

Например, у меня есть Person POJO:

public class Person {
  private String firstName;
  private String lastName;
  //getters/setters
}

Как преобразовать List<Person> в это:

<rootElement>
  <person>
    <firstName>John</firstName>
    <lastName>Smith</lastName>
  </person>
</rootElement>

И какой класс я должен использовать для его инкапсуляции? Эквивалентом для Джексона является JsonNode из пакета com.fasterxml.jackson.databind. Есть ли какие-либо предварительно настроенные компоненты, которые я могу использовать из Spring Boot?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
2 527
2

Ответы 2

Вручную

Вы можете использовать упомянутый Библиотека Джексона с форматом данных XML:

implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.8'

Сериализация:

Person person = new Person("Ima", "Person")
XmlMapper xmlMapper = new XmlMapper();
String personXml = xmlMapper.writeValueAsString(person);

Десериализация:

XmlMapper xmlMapper = new XmlMapper();
Person person = xmlMapper.readValue(personXml, SimpleBean.class);

Через REST API

Я оставляю этот раздел здесь, так как он может быть полезен другим, кто использует SpringBoot для веб-сервера:

Или, если вы используете стандартный spring-boot-starter-web и хотите обслуживать выходной XML через REST API, Spring автоматически выполнит преобразование за вас. например, возвращаемый тип Person этого метода означает, что Spring автоматически обработает преобразование и транспорт для вывода personService.findById(id)

 @GetMapping("/person")
public Person getPerson(@RequestParam("id") String id) {
    return personService.findById(id);
}

По умолчанию он будет обслуживать ваши объекты полезной нагрузки в формате JSON, но вы можете изменить его на XML, добавив приведенную выше зависимость для XML-формат данных Джексона.

И дополнительно установка типа Accept в заголовке запроса как Application/XML

Мне не нужна конечная точка REST для анализа XML. Я хочу сделать это вручную. Что такое XML-эквивалент ObjectMapper? Я знаю, что Spring будет использовать ObjectMapper за кулисами для разбора JSON, но как насчет XML?

George 24.01.2019 02:50

Глядя на документ jackson-dataformat-xml, похоже, что это XmlMapper. Я посмотрю, как это сработает.

George 24.01.2019 02:52

Да, я только сейчас понял, что оригинальный артефакт jackson-databind сам по себе не будет обрабатывать XML и фактически даже не нужен для этого. Я обновлю свой ответ соответственно

Péter Veres 24.01.2019 03:00

Для прямого преобразования списка в xml, я использую javax.xml.bind.marshaller.

Вы можете аннотировать свой класс pojo, как показано ниже.

@XmlRootElement("Person")
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {

    private String firstName;
    private String lastName;
    //getters/setters
}

И создайте класс List, обернув его.

@XmlRootElement(name = "Persons_List")
public class Persons_List {

    List<Person> persons;
    // Getters and Setters

}

И вы можете использовать Jaxb в своем методе, как показано ниже.

List<Person> persons = new List<Person>();
// add Person elements to it.
persons.add(person1);
persons.add(person2);

Persons_List persons_list = new Persons_List();
persons_list.setPersons(persons);

JAXBContext context = JAXBContext.newInstance(Persons_List.class, Person.class);
Marshaller jaxbMarshaller = context.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

//if you want to output to file.
OutputStream os = new FileOutputStream( "Person.xml" );
jaxbMarshaller.marshal(persons_list, os);

//if you want to display in console.
 jaxbMarshaller.marshal(persons_list,new PrintWriter(System.out));

Вывод будет:

<Persons_List>
   <Person>
       <firstName>John</firstName>
       <lastName>Smith</lastName>
   </Person>
   <Person>
       <firstName>Will</firstName>
       <lastName>Smith</lastName>
   </Person>
</Persons_List>

Другие вопросы по теме