java - XMLタグでファイルを分割する

原文 java xml split tags

私はJavaコーディングのアマチュアであり、割り当てに行き詰まっています。基本的な部分を除いてほとんどのコードを記述しましたが、その方法については空白を描いています。それがどのように行われるかについて誰かが私を正しい方向に向けることができることを望んでいました。

Splitterというクラスを作成しました。その仕事は、XMLファイルを読み取り、特定のXML startおよびendタグに基づいてそれを小さなファイルに分割することですが、それぞれの小さなファイルは指定されたmaxfilesizeよりも小さくなければなりません。

また、古いバージョンのファイルは、タイムスタンプを付けてアーカイブフォルダーに配置する必要があります。私はほとんどそれを持っています。これをstartタグとendタグで分割する方法がわからない場合を除きます。これらのタグの間のすべてを読み取るgetXMLメソッドがあります。しかし、そこからsplitメソッドに呼び出したときに、どうすればいいのかよくわかりません。

誰かが私を正しい方向に導くために共有できる情報を持っていますか?

public class Splitter {

  public static void split(String directory, String fileName, 
        String transactionTag, int fileSize) throws IOException{
    String startTag = "<"+ transactionTag + ">";
    String endTag = "</"+ transactionTag + ">";
    File f = new File(directory + fileName);
    File output = new File (directory + "Output/" + fileName);
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
    Splitter sp = new Splitter();
    int fileCount = 0;
    int len;
    int maxFileSize = fileSize;
    byte[] buf = new byte[maxFileSize]; 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss");
    Date curDate = new Date();
    String strDate = sdf.format(curDate);
    String fileTime = strDate;
    while ((len = in.read(buf)) > 0) {
        fileCount++;
        try{
            File afile =new File(directory + "Output\\" + fileName + "." + fileCount);
            if(afile.exists()){
                if(afile.renameTo(new File(directory + "Output\\Archive\\" + fileName + "." + fileCount + "-" + fileTime))){
                }else{
                    System.out.println("Files failed to be archived. ");
                }
            }else{
                System.out.println("This file does not exist.");
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(output + "." + fileCount));
        String newInput = new String(buf,0,len); // newInput is a String no greater in length than whatever bytes or chars
        String value = sp.getXML(newInput, transactionTag);

        //This part is incomplete.
        //Do something with value to make this class split the file by XML tags.
        //Also make sure any left over code before the first start tag and last end tag are also put into smaller files.

        int start = value.indexOf(startTag);
        int end = value.lastIndexOf(endTag);

        out.write(buf,0,len);
        out.close();
    }
    in.close();
  }
  public String getXML(String content, String tagName){
    String startTag = "<"+ tagName + ">";
    String endTag = "</"+ tagName + ">";
    int startposition = content.indexOf(startTag);
    int endposition = content.indexOf(endTag, startposition);
    if (startposition == -1)return "";
    startposition += startTag.length(); 
    if(endposition == -1) return "";
    return content.substring(startposition, endposition);
  }
  public static void main(String[]args) throws IOException{
    int num = 100;
    int kb = num * 1024;
    Splitter split = new Splitter();
    split("C:/SplitUp/", "fileSplit.xml", "blah1", kb);
    System.out.println("Program ran");
  }
}
答え
あなたのコメントに基づいて、私はあなたのfileSplit.xmlが次のように見えると仮定しています:

<header>
  <!-- Some XML metadata -->
<header>
<start>
  <!-- Some XML data -->
</start>
<start>
  <!-- Some XML data -->
</start>
<start>
  <!-- Some XML data -->
</start>
<start>
  <!-- Some XML data -->
</start>
<footer>
  <!-- Some XML metadata -->
<footer>


ここで、各<start><header><footer>およびそれらに対応する終了タグは、それぞれ独自の行にあります。

以下を使用してコードを簡略化できます。


java.nio.files.readAllLines(Path path, Charset cs)あなたのC:/SplitUp/fileSplit.xmlを読む
java.io.FileWriterすべてのサブファイルに書き込む。


基本的に(Java 7以降の場合)次のようなことができます。

// read the entire fileSplit.xml into an array of string
List<String> fileContent = files.readAllLines(Paths.get("C:/SplitUp/fileSplit.xml"), StandardCharsets.UTF_8);

// iterate through the array to split the file content into sub-files
String subFileContent = "";
for(String line : fileContent){
  if(line.compareToIgnoreCase("<start>") != 0 || line.compareToIgnoreCase("<footer>") != 0) { // keep reading if this line isn't a <start> nor a <footer>
    subFileContent += line;
  }
  else { // if this line is a <start> or a <footer>, write all the content thus-far into a new sub-file
    // sub-files names taken from your codes above. Make sure they are unique!
    FileWriter fileWriter = new FileWriter(directory + "Output\\" + fileName + "." + fileCount++);

    // this will write up to only maxFileSize number of characters.
    // how do you want to handle spillover?
    fileWriter.write(subFileContent, 0, maxFileSize);

    // reset subFileContent
    subFileContent = new String(line);
  }
}


の要件を満たすという点で


...それぞれの小さいファイルは、指定されたmaxfilesizeよりも小さくなければなりません


最後のelseelse ifに変更して、subFileContentlength()を超えたときにmaxFileSizeを強制的に書き出すことができ、残りが2番目のサブファイルに書き出されることを確認します。しかし、2番目の要件を処理する前に、最初に機能するサブファイルにコンテンツを分割する最初の部分を取得します。
関連記事

java - SpringセッションでX-Auth-Tokenが設定されず、JSESSIONIDがまだ存在する

java - SSLFactoryが使用するキーストアを確認しますか?例外:「sun…certpath.SunCertPathBuilderException:要求されたターゲットへの有効な証明書パスが見つかりません」

java - Apache POIが更新されていない行をスキップする

java - IntelliJ&Eclipse:Maven exec:execによって開始されたJavaアプリケーションのデバッグ

java - JDBCドライバーとsql2oを使用してPostgresサーバーに接続できません

java - Jersey Viewableの結果は404

java - RESTを使用してHP ALM 12で新しい欠陥を作成する方法

java - Google Java Style用にEmacsを設定する方法

java - マルチjarプロジェクトの難読化を保護する

java - Maven依存関係の最高/最低バージョンを指定する