从Java List对象创建XML的最有效方法

时间:2011-07-22 14:25:35

标签: java xml-serialization xstream apache-camel xmlmapper

我正在努力将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结构

提前致谢

3 个答案:

答案 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()函数导航到第一个列表条目中的右列标识符。