2015-05-29 3 views
2

Я любитель на Java-кодировании, и я застрял в задании. Я написал большую часть кода, кроме основной части, и я рисую пробел о том, как это сделать. Я надеялся, что кто-то может указать мне в правильном направлении, как это делается.Сплит-файл по тегам XML

Я сделал класс под названием Splitter. Его задача - прочитать в XML-файл и разделить его на более мелкие файлы на основе определенных тегов XML start и end, в то время как каждый меньший файл также должен быть меньше заданного maxfilesize.

Кроме того, старые версии файла должны быть помещены в папку архива с отметкой времени. В основном я это получил. Кроме того, я не уверен, как сделать этот раскол тегами start и end. У меня есть метод getXML, который читает все между этими тегами; но оттуда, когда я называю это методом разделения, я не уверен, что с ним делать.

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

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"); 
    } 
} 
+0

IIUC ваш единственный входной файл ('fileSplit.xml') имеет несколько тегов' start' и 'end', и вы разделите содержимое между каждой парой« start »и« end »тегов на отдельные отдельные файлы, правильно? –

+0

Да, это точно. Как бы то ни было, у меня есть этот код, работающий над тем, где он разбивает файл файловым файлом, но мне также нужно, чтобы он разбивался на те начальные и конечные теги. У меня есть метод getXML, который видит содержимое между тегом start и end, и я знаю, что мне нужно вызвать это в метод split и сделать какой-то цикл, чтобы сделать это все, но я не уверен, как идти об этом. Мне также нужно записать «остатки», то есть положить материал перед первым стартовым тегом и материалом после последнего тега в свои собственные файлы.Я был бы благодарен за любую информацию. – Galvatron

ответ

0

Основываясь на ваш комментарий, я предполагаю, что ваш 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> и их соответствующие закрывающие теги на свою собственную линию.

Вы можете упростить свои коды с помощью:

  1. java.nio.files.readAllLines(Path path, Charset cs) читать ваш C:/SplitUp/fileSplit.xml
  2. 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); 
    } 
} 

С точки зрения удовлетворения требования о

... каждый меньший размер файла должен быть меньше, чем a maxfilesize

Вы можете изменить последние else на else if на f orce subFileContent выписать, когда его length() превысил maxFileSize, и убедитесь, что остатки записаны во второй подфайл. Но я скажу, что первая часть разделения содержимого на подфайлы работает сначала, прежде чем разбираться со вторым требованием.

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