3

次のようなフラットファイルに従業員のレコードが書き込まれるシナリオがあります。

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. フラット ファイルの 1 行には、上記の 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 に書き込むかマーシャリングします (どちらが最適かは不明です)。

実装を達成するためのより良い提案やヒントを誰かに教えてもらえますか?

4

2 に答える 2

3

Java SE 6 以降の JDK/JRE で利用可能なライブラリを使用して、次のことを行います。

  1. XMLStreamWriterXML コンテンツをファイルに出力する StAX (JSR-173) を作成します。
  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"/>
于 2012-09-16T14:24:55.677 に答える
1

フラット ファイルを xml に変換する方法については、以下のチュートリアル リンクを参照してください。完全に読んでください。さらに、このチュートリアルを提供する理由は、魔法のジャンボがないことを認識させるためです。 xml に直接ファイルしbut yes there is a proper way to do it.....

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

于 2012-09-16T12:22:57.410 に答える