我正在努力将CSV转换为XML,虽然我有很多方法可以做到这一点,但我的要求是这样做,以便将来可以更改映射而不需要任何代码更改。
所以我们使用以下方法。
我们正在使用Apache camel进行集成,因此CSV正在被骆驼开箱即用,并以List<List<String>>
的形式提供
数据类似
{[header1,header2,header3],[1,2,3],[2,4,5]}
我需要将此列表数据转换为XML是已定义的表单但由于我无法使用java映射,因此计划执行类似的操作
使用XStream
将此List转换为平面XML文件,然后使用xslt将原始XML文件映射到xslt,但是当我使用XStream将List转换为XML时,它会提供以下输出
<list>
<java.util.Arrays_-ArrayList>
<a class="string-array">
<string>Quantity</string>
<string>Price</string>
<string>Total</string>
<string>Date</string>
<string>ID</string>
<string>Name</string>
<string>Ref#</string>
</a>
</java.util.Arrays_-ArrayList>
<java.util.Arrays_-ArrayList>
<a class="string-array">
<string>4</string>
<string>1.13</string>
<string>4.52</string>
<string>9/4/2008</string>
<string>275</string>
<string>Blue Ink</string>
<string>49385730</string>
</a>
</java.util.Arrays_-ArrayList>
<java.util.Arrays_-ArrayList>
<a class="string-array">
<string>5</string>
<string>2.16</string>
<string>2.16</string>
<string>8/3/2008</string>
<string>229</string>
<string>Red Ink</string>
<string>20549348</string>
</a>
我的示例CSV是
Quantity,Price,Total,Date,ID,Name,Ref#
4,1.13,4.52,9/4/2008,275,Blue Ink,49385730
5,2.16,2.16,8/3/2008,229,Red Ink,20549348
因此似乎无法使用XSLT将此原始XML映射到所需的XML。 有没有办法将此List数据转换为更可呈现的XML格式,以便我们可以使用XSLT映射该XML以避免任何代码更改。 或者是否有任何其他更有效的方法将此列表转换为XML结构
提前致谢
答案 0 :(得分:1)
这比我想象的要复杂得多,主要是由于List输入:
final List<String> headers = Arrays.asList("Quantity", "Price");
final List<String> row1 = Arrays.asList("1", "2");
final List<String> row2 = Arrays.asList("3", "4");
final XStream xStream = new XStream();
xStream.autodetectAnnotations(true);
final String xml = xStream.toXML(new Container(new Headers(headers), Arrays.asList( row1, row2)));
这会给你:
<Container>
<Headers>
<header>Quantity</header>
<header>Price</header>
</Headers>
<Part>
<Item>1</Item>
<Item>2</Item>
</Part>
<Part>
<Item>3</Item>
<Item>4</Item>
</Part>
</Container>
容器:
@XStreamAlias("Container")
class Container {
@XStreamAlias("Headers")
private final Headers headers;
@XStreamImplicit(itemFieldName = "Part")
private final List<LineItem> items = new ArrayList<LineItem>();
Container(final Headers headers, final List<List<String>> stringItems) {
this.headers = headers;
for (List<String> item : stringItems) {
items.add(new LineItem(item));
}
}
}
接头:
@XStreamAlias("Headers")
public class Headers {
@XStreamImplicit(itemFieldName = "header")
private final List<String> headers;
public Headers(final List<String> headers) {
this.headers = headers;
}
}
和LineItems:
@XStreamAlias("Items")
public class LineItem {
@XStreamImplicit(itemFieldName = "Item" )
private final List<String> items;
public LineItem(final List<String> items) {
this.items = items;
}
}
答案 1 :(得分:1)
如何描述生成的XML(标题成为元素标记),如果没有自定义编程,很难生成。最好的办法是使用DOM4J自己编写一些代码。
答案 2 :(得分:0)
我认为XSLT可以完成这项工作:
当您遍历所有列表条目时,可以使用xslt的position()函数导航到第一个列表条目中的右列标识符。