Как мне преобразовать списокв объект XML с использованием XMLMapper (Джексон)? - PullRequest
0 голосов
/ 31 января 2019

У меня есть таблица, которая представлена ​​как List<String[]>.Первый элемент списка - это заголовок, а каждый другой элемент - строка.Я заранее не знаю структуру Списка, поэтому создание класса, содержащего свойства / поля, не вариант.

Представьте, что у меня есть таблица (назовем ее «База данных»), которая выглядит следующим образом:

Age|Name|Sex
23 |John|Male
19 |Sam |Female
18 |Alex|Male

Первым элементом списка будет строковый массив, похожий на этот: ["Age", "Name", Sex "], в то время как строки будут выглядеть примерно так [" 23 ","Джон", "Мужской"]

Как получить вывод XML, похожий на этот:

<Table name="Database">
<Row name="1">
    <Item name="Age">23</Item>
    <Item name="Name">John</Item>
    <Item name="Sex">Male</Item>
</Row>
<Row name="2">
    <Item name="Age">19</Item>
    <Item name="Name">Sam</Item>
    <Item name="Sex">Female</Item>
</Row>
<Row name="3">
    <Item name="Age">18</Item>
    <Item name="Name">Alex</Item>
    <Item name="Sex">Male</Item>
</Row>

По сути, мне вручают ввод таблицыЯ запускаю свой алгоритм и получаю List в качестве возврата с первым элементом, являющимся заголовком.Я попытался использовать XMLMapper, и он работает для быстрого преобразования его в XML, но я не получаю нужный формат / структуру.

public String createXMLObject() throws IOException {
List<String[]> table = extractData(); //extractData() is my custom method 
ObjectMapper mapper = new XmlMapper();
String result = mapper.writeValueAsString(table);
mapper.writeValue(new File("test.xml"), table);
System.out.println(result);
return result;
}

Ответы [ 2 ]

0 голосов
/ 31 января 2019

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

Просто используйте StAX, например:

List<String[]> table = Arrays.asList(
        new String[] { "Age", "Name", "Sex"    },
        new String[] { "23" , "John", "Male"   },
        new String[] { "19" , "Sam" , "Female" },
        new String[] { "18" , "Alex", "Male"   } );

XMLStreamWriter xml = XMLOutputFactory.newFactory().createXMLStreamWriter(System.out);
xml.writeStartElement("Table");
xml.writeAttribute("name", "Database");

String[] header = table.get(0);
for (int rowNo = 1; rowNo < table.size(); rowNo++) {
    String[] row = table.get(rowNo);
    xml.writeCharacters(System.lineSeparator());
    xml.writeStartElement("Row");
    xml.writeAttribute("name", String.valueOf(rowNo));
    for (int colIdx = 0; colIdx < header.length; colIdx++) {
        xml.writeCharacters(System.lineSeparator() + "    ");
        xml.writeStartElement("Item");
        xml.writeAttribute("name", header[colIdx]);
        xml.writeCharacters(row[colIdx]);
        xml.writeEndElement(); // </Item>
    }
    xml.writeCharacters(System.lineSeparator());
    xml.writeEndElement(); // </Row>
}

xml.writeCharacters(System.lineSeparator());
xml.writeEndElement(); // </Table>
xml.close();

Выход

<Table name="Database">
<Row name="1">
    <Item name="Age">23</Item>
    <Item name="Name">John</Item>
    <Item name="Sex">Male</Item>
</Row>
<Row name="2">
    <Item name="Age">19</Item>
    <Item name="Name">Sam</Item>
    <Item name="Sex">Female</Item>
</Row>
<Row name="3">
    <Item name="Age">18</Item>
    <Item name="Name">Alex</Item>
    <Item name="Sex">Male</Item>
</Row>
</Table>
0 голосов
/ 31 января 2019

Использовать карту

List<String> head = Arrays.asList(data.get(0));
List<Map<String,String>> output = new ArrayList<>();
for (int i = 1; i < data.size(); i++) {
    String[] element = data.get(i);
    Map<String,String> person = new HashMap<>();
    for (int j = 0; j < element.length; j++) {
        person.put(head.get(j),element[j]);
    }
    output.add(person);
}

вывод

<ArrayList>
   <item>
      <Sex>Male</Sex>
      <Age>23</Age>
      <Name>John</Name>
   </item>
   <item>
      <Sex>Female</Sex>
      <Age>19</Age>
      <Name>Sam</Name>
   </item>
   <item>
      <Sex>Male</Sex>
      <Age>18</Age>
      <Name>Alex</Name>
   </item>
</ArrayList>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...