0

我正在努力将 CSV 转换为 XML,尽管我有很多方法可以做到这一点,但我的要求是以这样一种方式进行,即将来可以在不更改任何代码的情况下更改映射。所以我们使用以下方法。我们正在使用 Apache camel 进行集成,因此 CSV 被骆驼开箱即用地转换,并作为List<List<String>> 数据提供,例如

{[header1,header2,header3],[1,2,3],[2,4,5]}

我需要将此列表数据转换为 XML 是已定义的形式,但由于我不能使用 java 映射,因此计划使用类似的方法将此列表转换为平面 XML 文件,XStream而不是使用 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 格式,以便我们可以将该 XML 与 XSLT 映射以避免任何代码更改。或者有没有其他更有效的方法可以将此列表转换为 XML 结构

提前致谢

4

3 回答 3

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;
    }
}
于 2011-07-22T14:55:56.610 回答
1

生成的 XML 的描述方式(标题成为元素标签),如果没有自定义编程,真的很难生成。最好的办法是使用 DOM4J 自己编写一些代码。

于 2011-07-22T17:14:54.407 回答
0

我认为 XSLT 可以完成这项工作:

当您遍历所有列表条目时,您可以使用 xslt 的position()函数导航到第一个列表条目中的右侧列标识符。

于 2011-07-22T17:59:36.590 回答