# Xml lesen und in .txt zeilenweise schreiben



## theone101 (22. Feb 2008)

Hallo bin neu hier.
Vorab ich bin nicht so fit in Java aber wills werden 

Meine Problemstellung ist:

Ich habe mehrere XML files in vielen verschiedenen Unterverzeichnissen. Die XML files mit dem kommpletten Pfad sind in einer .txt datie Zeilenweise abgespeichert. Sprich:

C:\Ordner\Ordner\Datei1.xml
C:\Ordner\Ordner\Unterordner\Datei2.xml
usw.

Nun soll aus jeder XML bestimmte Informationen ausgelesen werden, nur Bestimmte. z.B.:
<Datum>
<Sprache>

Da in einigen files nicht alle infos stecken soll null ausgegeben werden wenn nix gefunden wird.
Ich möchte jetzt das immer eine XML aufgemacht wird nach den kriterien duchsucht wird und dann in ein textfile geschrieben wird und dann das nächste xml bearbeitet wird bis die liste der Pfade mit den XML dateien abgearbeitet wurde.
In die .txt soll so reingeschrieben werden, das jeder Tag durch ein "," getrennt ist und jede xml file nur in einer Zeile steht.
Sprich:

1.12.2003 , deutsch
12.4.2005 , englisch
15.6.2008 , null

Ich habe was versucht um den XML code zu lesen das klapt eigentlich auch schon gut nur kann ich das nur aus einer Datei. Ich möchte aber nicht alle Pfade eingeben sondern die aus der .txt file auslesen lassen.

Hoffe jemand kann mir einen rat geben, vielleicht geht des ja auch besser wie gesagt war bis jetzt nur so ein versuch.

Danke schon mal im vorraus.

Gruß Thomas


```
import java.io.*; 
 
public class XMLlesen {
 


	                public static String alles(String tag)
	                throws java.io.IOException
	                {
	                	
	                    String ausgabe = null;
	                    String Text = null;
	                    String Next = null;
	                    int laenge1 = 0;
	                    int laenge2 = 0;
	                    
	
	                    BufferedReader b = new BufferedReader
	                    (new FileReader ("C:\\muc.xml"));
	                  
	                    //XML einlesen und alle Space und tabs wegmachen 
	                    while ((Text = b.readLine()) != null){
	                    	Next = Text.trim();
	                        laenge1 = Next.length()-1;
	                        laenge2 = tag.length();
	                        int ende = laenge1-laenge2; //abziehen von gesamter Textlänge und den Tag
	                        
	        
	                            if(Text.contains(tag)){
	                                ausgabe = Next.substring(laenge2,ende); //ausgabe der einzelnen Tab texte
	                            }
               }
	                
	            
	            b.close();
	            return ausgabe;    
	                }
	                
	private static final String LINE_SEPARATOR = System.getProperty("line.separator");

	        	        
	              
	public static void main(String args[])
	throws java.io.IOException{

				
	            System.out.println();
	            System.out.print(alles("<Pid>")+", ");
	            System.out.print(alles("<Iso639LanguageCode>")+", ");
	            System.out.print(alles("<name>")+", "); //Line_seperator macht Zeilenumbruch
	           
	            System.out.print(alles("<TableId>")+", ");
	            System.out.print(alles("<Iso639LanguageCode>")+ LINE_SEPARATOR);
	            System.out.println();
	    
	    
	            PrintWriter p = new PrintWriter(new FileWriter ("C:\\ausgabe.txt"));
	            
	            p.print(alles("<Pid>")+", ");
	            p.print(alles("<Iso639LanguageCode>")+", "); 
	            p.print(alles("<name>")+ LINE_SEPARATOR);
	            p.print(alles("<UtcTime>"));
	            
	            p.println();
	            p.flush();
	            p.close();
	            
	    }
	}
```


----------



## Marco13 (22. Feb 2008)

Wenn du jetzt die "richtigen" XML-Parser verwendet hättest, würde ich die Frage verstehen (und das solltest du. nur nebenbei, mal in Erwägung ziehen....), aber wie man eine Datei liest, hast du ja schon - sinngemäß(!) wäre das ja sowas wie

```
BufferedReader b2 = new BufferedReader(new FileReader ("dieTextDatei.txt"));
String xmlDateiName;
while xmlDateiName= b2.readLine()) != null)
{
    BufferedReader b = new BufferedReader(new FileReader (xmlDateiName));
                    
    //XML einlesen und alle Space und tabs wegmachen
    (wie vorher...)
```
Das sollte man natürlich etwas aufräumen ... so, wie die "alles"-Methode im Moment implementiert ist, ist das ziemlich unschön..... 

http://www.google.de/search?hl=de&q=how+to+parse+an+xml+file+with+java&btnG=Google-Suche&meta=


----------



## theone101 (22. Feb 2008)

Ich wärds wahrscheinlich jezt ganz anders machen und alles über bord schmeißen und richtig den XMLParser einsetzen.

Aber leider funkts so immer noch nicht der ließt mir immer nur den letzten Pfad aus der .txt und nicht alle nacheinander.

Sprich:

C:\Ordner\ORdner\datei1.xml
C:\Ordner\ORdner\Ordner\datei2.xml

Da würde er nur die Letzte datei durchsuchen und ausgeben und leider nicht die erste und dann die zweite. Ich weis auch net warum des net Funzt.

Mich würds halt noch interessieren ob des so Funktioniert also wenn mir noch jemand etwas unter die arme greifen kann währe das sehr net.

Gruß 
P.S. Ich weiß der Stil ist miserabel aber ich musste des so schnell wie möglich zusammenschustern also bitte ich um Entschuldigung


----------



## Marco13 (22. Feb 2008)

Ja, wenn du das Codestück einfach an den Anfang deiner "alles"-Methode geschrieben hast, dann macht er natürlich "alles" mit allen Dateien, und nur das Ergebnis der letzten wirde zurückgegeben.

Ggf. müßtest du halt sowas machen wie

```
string alles(..., String xmlDateName)
{
    ...
    BufferedReader b = new BufferedReader(new FileReader (xmlDateiName)); 
    ...
    // Sonst ist 'alles' so wie vorher
}
```
und dann den Aufruf entsprechend machen

```
BufferedReader b2 = new BufferedReader(new FileReader ("dieTextDatei.txt"));
String xmlDateiName;
while xmlDateiName= b2.readLine()) != null)
{
    // Hier alles machen, was vorher in der main stand, aber die Aufrufe von 'alles' bekommen dann noch den aktuellen Dateinamen übergeben
    ....   alles(..., xmlDateiName);
```
(Ist aber genauso gehackt wie der Rest....)


----------



## theone101 (25. Feb 2008)

Hallo sorry das ich so lang gebraucht hab.

Funkt aber immer noch net weis auch net warum er gibt mir zwar 3zeilen aus wenn 3 Pfade drinnen sind aber es steht immer daselbe drinnen obwohl es andere dateien sind.
Obwohl in der Textdatei mehrere Pfade drinnen stehen.

Vielleicht weis jemand wie man des Lösen kann.
Mein Code Jetzt


```
import java.io.*;

public class XMLlesen {

	public static String alles(String tag, String xmlDateiName) throws java.io.IOException {
		
		String ausgabe = null;
		String Text = null;
		String Next = null;
		int laenge1 = 0;
		int laenge2 = 0;
		
		
		BufferedReader b2 = new BufferedReader(new FileReader ("C:\\Streams.txt"));
		while ((xmlDateiName= b2.readLine()) != null)
		{
		    BufferedReader b = new BufferedReader(new FileReader (xmlDateiName));
		
		
		//XML einlesen und alle Space und tabs wegmachen 
		while ((Text = b.readLine()) != null) {
			Next = Text.trim();
			laenge1 = Next.length() - 1;
			laenge2 = tag.length();
			int ende = laenge1 - laenge2; //abziehen von gesamter Textlänge und den Tag

			if (Text.contains(tag)) {
				ausgabe = Next.substring(laenge2, ende); //ausgabe der einzelnen Tab texte
			}
		}
		
	}
		
		return ausgabe;
	}

	private static final String LINE_SEPARATOR = System
			.getProperty("line.separator");

	public static void main(String args[]) throws java.io.IOException {
		
		BufferedReader b2 = new BufferedReader(new FileReader ("C:\\streams.txt"));
		String xmlDateiName;
		while ((xmlDateiName = b2.readLine()) != null)
		{

		System.out.println();
		System.out.print(alles("<Pid>",xmlDateiName) + ", ");
		System.out.print(alles("<Iso639LanguageCode>",xmlDateiName) + ", ");
		System.out.print(alles("<UtcTime>",xmlDateiName) + ", "); //Line_seperator macht Zeilenumbruch
		System.out.print(alles(">252<",xmlDateiName) + ", ");
		System.out.print(alles("<UtcTime>",xmlDateiName + LINE_SEPARATOR));
		System.out.println();
		

                PrintWriter p = new PrintWriter(new FileWriter("C:\\ausgabe.txt"));

		p.print(alles("<Pid>") + ", ");
		p.print(alles("<Iso639LanguageCode>") + ", ");
		p.print(alles("<name>") + LINE_SEPARATOR);
		p.print(alles("<UtcTime>"));

		p.println();
		p.flush();
		p.close();
		
		}
	}
}
```


----------

