Конвертировать записи плоских файлов в XML в Java

У меня есть сценарий, где записи сотрудников записаны в виде плоского файла, что-то вроде:

flatFile.txt
============
1|name1|dept1|10000
2|name2|dept2|12000
3|name3|dept3|9500
....
....

Теперь я хочу прочитать этот плоский файл и каждый раз преобразовывать вышеуказанные записи сотрудников в какой-то новый XML-файл, поэтому в конце у меня должен быть XML-файл со следующими данными:

<EMPLOYEES>
    <EMPLOYEE>
        <ID>1</ID>
        <NAME>name1</NAME>
        <DEPARTMENT>dept1</DEPARTMENT>
        <SALARY>10000</SALARY>
         </EMPLOYEE>
    <EMPLOYEE>
        <ID>2</ID>
        <NAME>name2</NAME>
        <DEPARTMENT>dept2</DEPARTMENT>
        <SALARY>12000</SALARY>
         </EMPLOYEE>
         ...
         ...
</EMPLOYEES>

Теперь для реализации этой концепции мне нужно позаботиться о проверке данных, таких как:

  1. ID и зарплата должна быть числовой
  2. длина имени должна быть не более 20
  3. одна строка плоского файла должна содержать более 4 полей

Если какая-либо из проверок не пройдена, их необходимо отразить в файле xml вместе с номером строки ошибки, например:

<NAME type="Error" Line="2"></NAME> (name length is greater than 20 in 2nd record of a flat file)

или же

<EMPLOYEE type="Error" Line="1"></EMPLOYEE> (first record doesn't contains enough fields)

Теперь приложения должны быть разработаны таким образом, чтобы компоненты могли быть заменены альтернативами. Например, должна быть возможность заменить синтаксический анализатор, используемый для анализа входного файла на основе разделителя, другим, который анализирует его как фиксированную длину.

Так или иначе, мне придется разработать концепцию в многоуровневой

Parsing -> Validation -> Output Generation.

Теперь, чтобы реализовать эту концепцию, я подумал о следующем:

  1. Считайте все записи из файла с помощью BufferedReader и токенизируйте его с помощью StringTokenizer.
  2. Инициализируйте объект сотрудника для каждой записи и добавьте их в некоторую коллекцию (Список).
  3. Сохраните ошибки (несоответствие полей или любую другую неудачную проверку) в Map>.
  4. Написать или маршалировать список в xml, используя какой-нибудь API XML Builder (неясно, какой из них будет лучшим).

Может кто-нибудь дать мне лучшее предложение или какие-либо советы для достижения реализации?

2 ответа

Решение

Я хотел бы сделать следующее, используя библиотеки, доступные в JDK/JRE начиная с Java SE 6.

  1. Создать StAX (JSR-173) XMLStreamWriter выводить содержимое XML в файл.
  2. Использовать XMLStreamWriter написать корневой элемент.
  3. Прочитайте следующую строку вашего ввода
  4. Преобразовать его в Employee объект
  5. Используйте JAXB (JSR-222), чтобы расположить объект к XMLStreamWriter
  6. Если есть другая строка, повторите шаг 3.
  7. Использовать XMLStreamWriter закончить документ.

ОБНОВИТЬ

Существуют различные варианты выполнения фактической проверки, ниже я покажу, как представить результирующую информацию в объектной модели, которую реализация JAXB может использовать для получения желаемого результата.

Работник

package forum12446506;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="EMPLOYEE")
public class Employee {

    @XmlAttribute(name="Line")
    Integer line;

    @XmlAttribute
    String type;

    @XmlElement(name="ID")
    Value id;

    @XmlElement(name="NAME")
    Value name;

    @XmlElement(name="DEPARTMENT")
    Value department;

    @XmlElement(name="SALARY")
    Value salary;

    public Employee() {
    }

    public Employee(int line, String type) {
        this.line = line;
        this.type = type;
    }

}

Значение

package forum12446506;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Value {

    @XmlAttribute(name="Line")
    Integer line;

    @XmlAttribute
    String type;

    @XmlValue
    String value;

    public Value() {
    }

    public Value(Integer line, String type, String value) {
        this.line = line;
        this.type = type;
        this.value = value;
    }

}

Выход

<EMPLOYEE>
    <ID>1</ID>
    <NAME type="Error" Line="1"/>
</EMPLOYEE>

<EMPLOYEE type="Error" Line="2"/>

Прочитайте приведенную ниже ссылку на учебник, чтобы узнать, как можно преобразовать плоский файл в xml, и, пожалуйста, прочитайте его полностью, кроме того, причина, по которой вам нужно ознакомиться с этим учебником, состоит в том, чтобы вы знали, что не существует волшебного громоздкого конвертирования плоских файлов. файл прямо в XML, but yes there is a proper way to do it.....

http://cafeconleche.org/books/xmljava/chapters/ch04.html

Другие вопросы по тегам