2012-03-22 3 views
0

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

Вот 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> 
+0

Я не знаю ни сторонних библиотек, которые были бы легче, чем просто написав что-то обычай. Поскольку данные, похоже, ограничены таблицей или пробелом, я бы, вероятно, просто использовал StringTokenizer для разрыва текстового файла и повторного инициализации в виде XML в цикле. – derdc

ответ

0

Вам не требуется специальная библиотека сторонних разработчиков для создания довольно простого XML-формата. Вы можете просто написать a в объект 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>"); 
... 

Однако я не обязательно защищаю его. Я лично рекомендую Simple 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

Я не понимаю, где нам нужно сопоставить материал в pojo из txt-файла, я уже проанализировал мой txt и получил данные как «Список '? – Rachel

+0

Сопоставление может быть излишним в вашем довольно простом случае, но я думал, что я включил его, потому что ИМХО лучше работать с классами, которые моделируют ваши данные, а не списки массивов строк. Поэтому, хотя вам и не нужно * делать это таким образом, я думаю, что он может сделать ваш код более четким и гибким, если расшифровка кода будет включать более сложные функции. – arooaroo

1

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

+1

И если у вас уже есть XML-схема, вы можете даже работать по-другому и генерировать классы Java из схемы. – rob

0

Ваш 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"); 
0

Возможно, 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

Где этот сгенерированный XML записывается? – Rachel

+0

'XStream' - хорошая библиотека, но мне не нужны теги« xml », но они дают такие теги, как' list', 'string-array',' string', но мне нужно иметь такие теги, как 'ContractDate',' Trader' и 'Quantity' – Rachel

Смежные вопросы