Генерация XML из списка массивов строк в Java - PullRequest
0 голосов
/ 22 марта 2012

Я использую opencsv для анализа текстового файла и генерации List<String[]>, теперь я хочу сгенерировать XML из List<String[]>, и поэтому мой вопрос: есть ли у нас 3rd Party Libraries, который выполняет это преобразование, если нет что бы лучше подходить к решению проблемы.

Вот это Parsing Logic:

    public class ParseFile {

    public ParseFile() {

    }

    public void getQuotes() {
        String fileName = "C:\\GS.txt";
        try {
            CSVReader reader = new CSVReader(new FileReader(fileName), '\t');
            String[] nextLine;
            List<String[]> dataList = new ArrayList<String[]>();
            dataList = reader.readAll();
        } catch (Exception e) {
        }
    }

    public static void main(String args[]) {
        ParseFile test = new ParseFile();
        test.getQuotes();
        System.out.println("Parsing Done Successfully....");
    }
}

Итак, мой txt файл выглядит так:

Header Information: ContractDate Trader  Quantity
1st Line of Data:   03/23/12     GS      100

и мне нужно иметь XML Structure вроде:

<root>
  <entry id='1'>
    <ContractDate>03/23/12</ContractDate>
    <Trader>GS</Trader>
    <Quantity>100</Quantity>
  </entry>
</root>

Ответы [ 4 ]

1 голос
/ 22 марта 2012

Я бы использовал JAXB - http://jaxb.java.net/ - вы можете создать POJO, аннотировать его с помощью JAXB и затем записать в XML.

0 голосов
/ 23 марта 2012

Может быть XStream будет хорошим решением для вас. Это отличный и простой API для чтения / записи XML и не только ...:)

Ваш пример с XStream:

public class ParseFile {

public ParseFile() {

}

public void getQuotes() {
    String fileName = "C:\\GS.txt";
    try {
        CSVReader reader = new CSVReader(new FileReader(fileName), '\t');
        String[] nextLine;
        List<String[]> dataList = new ArrayList<String[]>();
        dataList = reader.readAll();
    } catch (Exception e) {
    }

//Convert to XML with XStream
XStream xstream = new XStream();
String xmlContent = xstream.toXML( dataList );

}

public static void main(String args[]) {
    ParseFile test = new ParseFile();
    test.getQuotes();
    System.out.println("Parsing Done Successfully....");
}
}
0 голосов
/ 22 марта 2012

Вам явно не нужна сторонняя библиотека для генерации вашего довольно простого формата XML. Вы можете просто записать объект StringBuffer:

...
StringBuffer sb = new StringBuffer();
sb.append("<root>");
for (String[] row: dataList) {
  sb.append("<entry>");
  sb.append("<ContractDate>").append(row[0]).append("</ContractDate>");
  // etc...
  sb.append("</entry>");
}
sb.append("</root>");
...

Однако я не обязательно защищаю это. Я лично рекомендую Простой XML . Создайте POJO для моделирования ваших строк (я не буду включать все свойства в моем примере):

@Root
public class Entry {

  @Element
  private String trader;

  @Attribute
  private int id;

  public Entry() {
    super();
  }  

  public String getTrader() {
    return text;
  }

  public void setTrader(String trader) {
    this.trader = trader;
  }

  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
}

@Root(name="root")
public class Entries {
   @ElementList(inline=true)
   List<Entry> entries;

   public Entries(List<Entry> entries) {
     this.entries = entries;
   }
}

Это, конечно, некоторая дополнительная работа заранее, но для нетривиальных программ наличие правильных классов Java для представления моделей данных имеет большой смысл и обеспечивает большую гибкость и ясность кода.

Чтобы сохранить сохранить как XML, вы делаете это:

 List<Entry> entryList = new ArrayList();
 int entryCount = 0;
 Serializer serializer = new Persister();
 for (String[] row: dataList) {
   Entry entry = new Entry();
   entry.setTrader(row[1]);
   entry.setId(++entryCount);
   entryList.add(entry);
 }
 File result = new File("entries.xml");
 serializer.write(new Entries(entryList), result);

Простая библиотека XML дает вам большую гибкость. Вы также можете загрузить файл XML обратно в список объектов Entry.

0 голосов
/ 22 марта 2012

Ваш XML достаточно прост. Я бы просто перебрал ваши данные в цикле и выписал XML, используя StringBuilder.

StringBuilder builder = new StringBuilder();
builder.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
builder.append("<root>\n");

int entryId = 1;
for (String[] data : dataList) {
  builder.append("\t<entry id='" + entryId++ + "'>\n");
  builder.append("\t\t<ContractDate>" + data[0] + "</ContractDate>\n");
  // etc
}

builder.append("</root>\n");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...