Вы должны иметь возможность комментировать Map
с помощью MapAdapter
из ссылки , которую вы указали, поэтому вам нужно создать подкласс.
@XmlJavaTypeAdapter(MapAdapter.class)
public class Record extends HashMap<String, String> {
}
Тогда вашКласс таблицы достаточно прост, хотя вам нужно пометить @XmlElementWrapper
, чтобы получить дополнительный уровень XML.
@XmlRootElement(name = "TABLE")
public class Table {
private List<Record> records = new ArrayList<>();
@XmlElementWrapper(name = "RECORDS")
@XmlElement(name = "RECORD")
public List<Record> getRecords() {
return this.records;
}
public void setRecords(List<Record> records) {
this.records = records;
}
}
При работе с JAXB и синтаксический анализ не загружает всея обнаружил, что эта информация помогает сначала написать код для генерации XML, потому что в сгенерированном XML вы можете увидеть, как отображения JAXB отличаются от того, что вы ожидали / намеревались.
Создать пример данных проще, если вы добавите несколько вспомогательных методов в вышеупомянутые классы, поэтому давайте сделаем это сначала:
@XmlJavaTypeAdapter(MapAdapter.class)
public class Record extends HashMap<String, String> {
private static final long serialVersionUID = 1L;
public Record addElement(String name, String value) {
put(name, value);
return this;
}
@Override
public String toString() {
return "Record" + super.toString();
}
}
@XmlRootElement(name = "TABLE")
public class Table {
private List<Record> records;
public Table() {
this.records = new ArrayList<>();
}
public Table(Record... records) {
this.records = Arrays.asList(records);
}
@XmlElementWrapper(name = "RECORDS")
@XmlElement(name = "RECORD")
public List<Record> getRecords() {
return this.records;
}
public void setRecords(List<Record> records) {
this.records = records;
}
@Override
public String toString() {
return "Table" + this.records.toString();
}
}
Затем мы можем легко написать тестовый код, чтобы увидеть, что онвсе работает нормально.
Создание данных для генерации в виде XML
Table table1 = new Table(
new Record().addElement("DOC_ID", "some value")
.addElement("ENTITY_ID", "some value"),
new Record().addElement("SUB_ID", "some value")
.addElement("CASE_DOC_ID", "some value")
);
System.out.println(table1);
Table[Record{DOC_ID=some value, ENTITY_ID=some value}, Record{SUB_ID=some value, CASE_DOC_ID=some value}]
Создание XML
String xml;
try (StringWriter out = new StringWriter()) {
JAXBContext jaxbContext = JAXBContext.newInstance(Table.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(table1, out);
xml = out.toString();
}
System.out.println(xml);
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<TABLE>
<RECORDS>
<RECORD>
<DOC_ID>some value</DOC_ID>
<ENTITY_ID>some value</ENTITY_ID>
</RECORD>
<RECORD>
<SUB_ID>some value</SUB_ID>
<CASE_DOC_ID>some value</CASE_DOC_ID>
</RECORD>
</RECORDS>
</TABLE>
Мы можем подтвердить, что отображения JAXB генерируют формат XML, который мы намереваемся проанализировать.
Parse XML
Table table2;
{
JAXBContext jaxbContext = JAXBContext.newInstance(Table.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
table2 = (Table) unmarshaller.unmarshal(new StringReader(xml));
}
System.out.println(table2);
Table[{DOC_ID=some value, ENTITY_ID=some value}, {SUB_ID=some value, CASE_DOC_ID=some value}]
Как видите, проанализированные данные имеют все значения и соответствуют исходным данным.