有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

xml序列化从java列表对象创建xml的最有效方法

我正在致力于将CSV转换为XML,虽然我有很多方法可以做到这一点,但我的要求是这样做,即将来可以在不更改任何代码的情况下更改映射。 因此,我们使用以下方法。 我们正在使用ApacheCamel进行集成,因此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。 是否有任何方法将此列表数据转换为更具表现力的XML格式,以便我们可以使用XSLT映射该XML以避免任何代码更改。 或者有没有其他更有效的方法将此列表转换为XML结构

提前谢谢


共 (3) 个答案

  1. # 1 楼答案

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

    迭代所有列表项时,可以使用xslt的position()函数导航到第一个列表项中的右列标识符

  2. # 2 楼答案

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

  3. # 3 楼答案

    这比我想象的要复杂,主要是因为列表输入:

        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;
        }
    }
    

    和行项目:

    @XStreamAlias("Items")
    public class LineItem {
        @XStreamImplicit(itemFieldName = "Item" )
        private final List<String> items;
    
        public LineItem(final List<String> items) {
            this.items = items;
        }
    }