Самый эффективный способ создания XML из объекта списка Java - PullRequest
0 голосов
/ 22 июля 2011

Я работаю над преобразованием CSV в XML, хотя у меня есть много способов сделать это, но мое требование состоит в том, чтобы сделать это таким образом, чтобы в будущем отображение могло быть изменено без какого-либо изменения кода.поэтому мы используем следующий подход.мы используем Apache верблюда для интеграции, поэтому 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

, поэтому кажется невозможным сопоставить этот необработанный XML с требуемым XML с помощью XSLT,Есть ли способ преобразовать эти данные List в какой-то более презентабельный формат XML, чтобы мы могли отобразить этот XML с помощью XSLT, чтобы избежать каких-либо изменений кода.Или есть какой-либо другой, более эффективный способ преобразования этого списка в структуру XML

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 22 июля 2011

То, как описывается сгенерированный XML (заголовки становятся тегами элемента), действительно сложно создать без специального программирования. Лучше всего написать код самостоятельно, используя DOM4J.

1 голос
/ 22 июля 2011

Это было сложнее, чем я думал, в основном из-за ввода списка:

    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;
    }
}
0 голосов
/ 22 июля 2011

Я думаю, что XSLT может сделать работу:

Вы можете использовать функцию position () в xslt для перехода к правому идентификатору столбца в первой записи списка, когда вы повторяете все записи списка.

...