我有一个表示为List<String[]>
的表。列表的第一个元素是标题,其他元素是一行。我不知道列表的结构,因此创建包含属性/字段的类不是一种选择。
想象一下,我有一个看起来像这样的表(我们称它为“数据库”):
Age|Name|Sex
23 |John|Male
19 |Sam |Female
18 |Alex|Male
列表的第一个元素将是一个字符串数组,如下所示: [“ Age”,“ Name”,Sex“],而这些行看起来像这样[[23”,“ John”,“ Male”]
如何获得如下所示的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;
}
答案 0 :(得分:2)
为此,无需杰克逊的开销,尤其是因为无论如何,您都必须先将数据转换为其他格式。
只需使用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>
答案 1 :(得分:1)
使用地图
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>