#java #xml #csv #jaxb
#java #xml #csv #jaxb
Вопрос:
У меня есть определенное количество аннотированных классов JAXB, сгенерированных из некоторого DTD, которые позволяют мне преобразовывать объекты в xml и xml в объекты совершенно автоматическим способом. Эти XML отправляются в некоторые удаленные службы, предоставленные нам некоторыми поставщиками. Затем другие xml-файлы возвращаются и анализируются в объекты нашего домена.
Процесс подачи заявки выглядит примерно так
- Обрабатывать объекты домена
- Сопоставьте их с объектами JAXB
- Переведите их в xml с помощью jaxb marshaller.
Обратный поток, который преобразует полученные XML-файлы в объекты JAXB, а затем в объекты домена, аналогичен.
Сопоставление между объектами домена и объектами JAXB не является автоматическим: поля и структура отличаются. Итак, в этом есть некоторая логика.
Теперь поставщик попросил нас предоставить файлы CSV вместо файлов XML. Это проблема, потому что мы не хотим дублировать логику отображения. Итак, мы хотели бы повторно использовать объекты JAXB (и, возможно, их аннотации).
Мы также хотели бы избежать выполнения процесса в 2 этапа, такого как генерация xml, а затем перевод его в CSV, если это возможно (и так для обратного процесса).
Есть ли способ «автоматически» отображать объекты в CSV с использованием объектов JAXB (т. Е. Аннотаций JAXB)? Чтобы было понятнее, вершиной было бы сохранение имен xml-тегов в столбцах csv.
В противном случае, как мы можем решить это каким-то элегантным способом?
ПРИМЕЧАНИЕ. Я знаю, как отображать классы Java в столбцы csv. Что я имею в виду под «элегантным», так это то, что без перезаписи новых классов отображения или, возможно, без необходимости изменять отображение данных. Например, с помощью ObjectMapper в Jackson-dqataformat-text возможно преобразование данных, но в этом случае я должен использовать имена полей объектов Java, а не отображенные поля, используемые в xml
Спасибо за поддержку
Ответ №1:
это невозможно. JAXB (привязка Jakarta XML) облегчает сопоставление между xml и Java. это позволяет конвертировать объект Java в xml и xml в объект Java. следовательно, невозможно использовать эту платформу для преобразования объекта Java в CSV. для получения дополнительной информации
но для вашего требования есть другая поддержка фреймворка, преобразующая java object в csv. opencsv — лучшая библиотека для работы с csv на Java.для получения дополнительной информации.
следующий пример связан с opencsv.
Person.java
public class Person {
@CsvBindByPosition(position = 0)
private int id;
@CsvBindByPosition(position = 1)
private String name;
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}
преобразовать список пользователей в csv
try {
FileWriter writer = new FileWriter("output.csv");
List<Person> listPerson = new ArrayList<Person>();
listPerson.add(new Person(1, "Test One"));
listPerson.add(new Person(2, "Test Two"));
ColumnPositionMappingStrategy mappingStrategy= new ColumnPositionMappingStrategy();
mappingStrategy.setType(Person.class);
StatefulBeanToCsvBuilder<Person> builder= new StatefulBeanToCsvBuilder(writer);
StatefulBeanToCsv beanWriter = builder.withMappingStrategy(mappingStrategy).build();
beanWriter.write(listPerson);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
вывод,
1, Test One
2, Test Two
добавьте в свой проект следующие зависимости,
- opencsv
- commons-beanutils
- commons-коллекции
- commons-lang3
- commons-ведение журнала
Комментарии:
1. Я знаю это, хорошее решение, а также использование текста формата данных Джексона. github.com/FasterXML/jackson-dataformats-text . Я хотел повторно использовать аннотации jaxb, потому что они описывают поля с одинаковыми именами. Таким образом, либо мне нужно скомпилировать аннотации для каждого класса (а их много), либо я отправляю / получаю данные, сопоставленные с именем полей Java, т. Е. меняю свой контракт. Вот почему я спрашиваю. Но для m важно иметь «окончательный» ответ на эту тему. Кажется, ответа НЕТ, но я немного подожду