【问题标题】:Most Efficient way to create XML from java List object从 java List 对象创建 XML 的最有效方法
【发布时间】:2011-10-11 02:41:55
【问题描述】:

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

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

我需要将此列表数据转换为 XML 是已定义的形式,但由于我不能使用 java 映射,所以打算做类似的事情 使用XStream 将此列表转换为平面 XML 文件,然后使用 xslt 将原始 XML 文件映射到 xslt,但是当我使用 XStream 将列表转换为 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 结构

提前致谢

【问题讨论】:

  • 所需的 XML 是什么?在将 XStream 输出转换为所需的 XML 格式时遇到什么问题?
  • @Olaf:最终的 XML 可以是团队决定的任何格式,但我主要关心的是 XStream 提供的输出,因为我放在帖子中的一个输出似乎无法满足我的目标,因为我将无法在其中使用 XSLT,我想要的只是 XStream 的输出应该像标题值应该作为标签工作,并且标签内应该有值,以便我可以使用 XSLT 将其转换为所需格式

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


【解决方案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;
    }
}

【讨论】:

  • 实际问题是在 cmets 中描述的,而不是问题本身。 OP 希望使用标题行定义的元素标签生成 XML。我不相信你可以用 XStream 做到这一点。我建议使用 DOM4J。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我认为 XSLT 可以胜任:

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

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      相关资源
      最近更新 更多