0

私はCSVからXMLへの変換に取り組んでいますが、これを行うには多くの方法がありますが、私の要件は、将来的にコードを変更せずにマッピングを変更できるようにすることです. そのため、次のアプローチを使用しています。統合にApacheキャメルを使用しているため、CSVはキャメルによってすぐに変換され、次のList<List<String>> ようなデータとともに提供されます

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

XStreamこのリスト データを定義済みの形式である XML に変換する必要がありますが、Java マッピングを使用できないため、 xslt を使用して生の XML をマッピングするよりも、このリストをフラットな 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 構造に変換するより効率的な方法は他にありますか

前もって感謝します

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

および広告申込情報:

@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 に答える