# Konkatenation von XML-Files



## oschli (8. Mrz 2006)

Hi,

ich erzeuge auf einem Linux Rechner eine XML-Datei. Durch logrotate wird sichergestellt das die Dateien nicht zu groß werden. Die alten Dateien werden hochgezählt und eine neue log.xml erstellt. Folglich hat log1.xml den run 1-3 und log.xml run 4-6.


log1.xml

```
<Logfile>
   <run>1</run>
   <run>2</run>
   <run>3</run>
</Logfile>
```


log.xml

```
<Logfile>
   <run>4</run>
   <run>5</run>
   <run>6</run>
</Logfile>
```
Es kann davon ausgegangen weden, dass mindestens die Datei log.xml vorhanden ist. 

Jetzt würde ich gerne die Dateien auswerten. Dazu müßte ich alle Dateien in eine Datei schreiben und diese weiterverarbeiten. 

Wie könnte ich das machen?


----------



## Bleiglanz (8. Mrz 2006)

warum musst du die alle in eine neue Datei schreiben?

nimm halt SAX und parse die Dateien nacheinander??


----------



## oschli (8. Mrz 2006)

Da jedes <run> Element ein Datum enthält war mein erster Gedanke, die Dateien in einer Datei zuordnen, bevor ich diese dann auswerte.

Hab bis jetzt leider noch nichts mit SAX gemacht. Werde mich da heute abend mal ein bißchen schlauer machen.


----------



## oschli (9. Mrz 2006)

Hi,

hier mal mein erster Versuch. Der hat allerdings noch ziemliche macken. Außerdem heißen die Logfiles jetzt:

log0.xml "zeitlich das neuste"
log1.xml
log2.xml "zeitlich das älteste"
usw.

Damit die Datei gültig wird mußte ich ein neuese root Element (Konkat) schreiben, wie könnte ich das umgehen?

```
public void checkIfFilesExist(String directory)throws NoFile, FileNotFoundException{
		
                concatFile_ =new File(direcotory+"/concat.xml");
		
		myDirectory_=new File(directory);
		dirList_=myDirectory_.listFiles();
				
		FileOutputStream fOStream = new FileOutputStream (concatFile_);
		PrintWriter pWriter = new PrintWriter (fOStream);
		pWriter.println("<Konkat>");
		for (int i=dirList_.length-1;i>=0;i--){
		   System.out.println(i);
		   System.out.println(dirList_[i]);
		   try {
			   FileReader fReader = new FileReader(dirList_[i]);
			   BufferedReader bReader = new BufferedReader(fReader);
			   
			   try {
				   String line;
				   while((line=bReader.readLine())!=null){
					   System.out.println(line);
					   pWriter.println(line);
				   }
				   bReader.close();
				  
				   
			   } 
			   catch (IOException e) {
				   e.printStackTrace();
			   }
		   } 
		   catch (FileNotFoundException e) {
			   e.printStackTrace();
		   }
		}
		pWriter.println("</Konkat>");
		pWriter.close();
		if(!concatFile_.exists()){
			throw new NoFile();
		}
	}
```

concat.xml

```
<Konkat>
  <Logfile>
     <Run>1</Run>
     <Run>2</Run>
     <Run>3</Run>
  </Logfile>
  <Logfile>
      <Run>4</Run>
      <Run>5</Run>
      <Run>6</Run>
  </Logfile>
  <Logfile>
      <Run>7</Run>
      <Run>8</Run>
      <Run>9</Run>
  </Logfile>
</Konkat>
```


----------



## mic_checker (9. Mrz 2006)

Du machst es ja bisher auf konventionellem Weg über das IO Package, aber du brauchst doch gar nicht eine große Datei...so wie ich das sehe.
Du willst lediglich die Einträge in diversen Log-Dateien auswerten. Dafür kannst du wie Bleiglanz bereits geschrieben hat SAX verwenden. Dann parst du einfach nacheinander die entsprechenden Dateien mit SAX, außer es besteht ein guter Grund dafür die zuerst in eine Datei zu schreiben.

Schau dir einfach mal SAX an, hier im Forum findest du sicher einige Beiträge , heisst nicht umsonst Simple API for XML access


----------

