Einlesen von mehreren XML files und ausgeben in txt datei

theone101

Mitglied
Hallo erst mal,
ich bin neu hier und habe ein kleines Problem hoffe ihr könnt mir weiterhelfen.
Vorab ich kann Java net so gut also ich bin für jede Kritik offen.

Meine Problemstellung ist:

Ich habe mehrere XML files in vielen verschiedenen Unterverzeichnissen. Die XML files mit dem kommpletten Pfad sind in einer .txt datei 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.

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.

Also sprich eine schleife da habe ich was versucht aber er gibt mir in mein neues .txt nur 1 Zeile aus und nicht 3 obwohl in der Pfad.txt 3 Pfade drinnen stehen nimmt er mir nur den ersten.

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

Hier mein Code
Code:
import java.io.*;

public class XMLlesen {

	public static String alles(String tag, String xmlDateName) 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 ((xmlDateName = b2.readLine()) != null)
		{
		    BufferedReader b1 = new BufferedReader(new FileReader (xmlDateName));
		
		
		//XML einlesen und alle Space und tabs wegmachen 
		while ((Text = b1.readLine()) != null) {
			
			Next = Text.trim();
			laenge1 = Next.length()-1;
			laenge2 = tag.length();
			int ende = laenge1 - laenge2; 

			if (Text.contains(tag)) {
				ausgabe = Next.substring(laenge2, ende); 
			}
			
			
		}
		
	}
		
		return ausgabe;
	}

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

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

		
		PrintWriter p = new PrintWriter(new FileWriter("C:\\ausgabe.txt"));
		
		BufferedReader b = new BufferedReader(new FileReader ("C:\\streams.txt"));
		String xmlDateiName;
		while ((xmlDateiName = b.readLine()) != null)
		{
		p.print(alles("<Pid>",xmlDateiName) + ", ");
		p.print(alles("<Iso639LanguageCode>",xmlDateiName) + ", ");
		p.print(alles(">252<",xmlDateiName) + ", ");
		p.print(Zeilelesen.ZeileW(">252<",xmlDateiName) + ", ");
		p.print(alles("<name>",xmlDateiName)+ ", ");
		p.print(alles("<UtcTime>",xmlDateiName)+ LINE_SEPARATOR);

		p.println();
		p.flush();
		p.close();
		
		}
	}
}
 
ich hab mal ein Programm geschreiben die XML Dateien ausliest und dann in Config Datei umwandelt..

so ich gib dir mal meine Hauptklasse und die ConfigKlasse.. die anderen Nebenklassen müssten normal nicht von belang sein.

Hauptsächliches steht das meiste im unteren Teil



Code:
import java.io.*;
import java.util.*;

import javax.xml.parsers.*;

import org.w3c.dom.*;
import org.xml.sax.*;



public class ConfigWriter {

    private String targetLoad;
    private String targetSave;
    private String targetXML;

    private HashMap<String, ConfigType> hashXML = new HashMap<String, ConfigType>();

    public ConfigWriter(String targetLoad, String targetSave, String targetXML)
            throws Exception {
        this.targetLoad = targetLoad;
        this.targetSave = targetSave;
        this.targetXML = targetXML;
        configReader();
    }

    public void configReader() throws Exception {

        String row;
        String[] part;

        File loadFile = new File(targetLoad);
        File saveFile = new File(targetSave);

        FileInputStream fileInputStream = new FileInputStream(targetXML);
        Config config = new Config(saveFile, false, true);

        Document document = loadDocument(fileInputStream);
        parseDocument(document);

        ConfigType lastConfigType = null;
        ConfigType configType = null;
        try {
            BufferedReader reader = new BufferedReader(new FileReader(loadFile));
            row = reader.readLine();
            while (row != null) {
                part = row.split(";");
                if (hashXML.containsKey(part[0])) {
                    lastConfigType = configType;
                    configType = hashXML.get(part[0]);
                    List<ConfigElement> list = configType.getList();
                    if (list.size() == part.length - 1) { // anschauen
                        String section;
                        configType.increaseZaehler();
                        if (configType.getAnzahlZaehler() == 1) {
                            section = configType.getSection(configType
                                    .getZaehler());
                        } else {
                            
                            section = configType.getSection(lastConfigType.getZaehler(), configType.getZaehler());
                        }
                        
                        
                        Iterator<ConfigElement> iter = list.iterator();
                        for (int i = 1; iter.hasNext(); i++) {
                            ConfigElement configElement = iter.next();
                            if (configElement.isCreate()) {
                                String key = configElement.getName();
                                String value = part[i];
                                if (part[i].equals("")) {
                                    value = configElement.getDefaultValue();
                                }
                                config.set(section, key, value);
                            }
                        }
                    } else {
                        // TODO throw Exception
                        System.out.println("bla" + (part.length - 1) + " - "
                                + list.size());
                    }
                }
                row = reader.readLine();
            }
            reader.close();
            config.writeConfigData();
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
    }

    private Document loadDocument(InputStream menubarConfiguration)
            throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setValidating(false);
        DocumentBuilder builder = factory.newDocumentBuilder();

        builder.setErrorHandler(new ErrorHandler() {
            public void warning(SAXParseException ex) throws SAXException {
                throw ex;
            }

            public void error(SAXParseException ex) throws SAXException {
                throw ex;
            }

            public void fatalError(SAXParseException ex) throws SAXException {
                throw ex;
            }
        });
        return builder.parse(menubarConfiguration);
    }

    private void parseDocument(Document document) {
        Element parent = document.getDocumentElement();
        NodeList child = parent.getChildNodes();

        for (int i = 0; i < child.getLength(); i++) {
            Node type = child.item(i);
            String nodeName = type.getNodeName();
            if (nodeName.equals("#text") || nodeName.equals("#comment")) {
                continue;
            }
            Element typeElement = (Element) type;

            NodeList elementList = type.getChildNodes();

            List<ConfigElement> configElementList = new ArrayList<ConfigElement>();

            for (int j = 0; j < elementList.getLength(); j++) {
                Node element = elementList.item(j);
                String elementName = element.getNodeName();
                if (elementName.equals("#text")
                        || elementName.equals("#comment")) {
                    continue;
                }
                Element elementElement = (Element) element;
                String attr_Name = elementElement.getAttribute("name");
                String attr_Typ = elementElement.getAttribute("typ");
                String attr_Default = elementElement.getAttribute("default");
                Boolean attr_Create = elementElement.getAttribute("erzeuge")
                        .equals("J");

                ConfigElement configElement = new ConfigElement(attr_Name,
                        attr_Typ, attr_Default, attr_Create);

                configElementList.add(configElement);

            }

            String nameTypElement = typeElement.getAttribute("name");
            String formatTypeElement = typeElement.getAttribute("format");
            ConfigType configType = new ConfigType(nameTypElement,
                    formatTypeElement, configElementList);
            hashXML.put(nameTypElement, configType);

        }
    }
}




    public class ConfigElement {
    private String name;
    private String type;
    private String defaultValue;
    private boolean create;

    public ConfigElement(String name, String type, String defaultValue,
            boolean create) {
        super();
        this.name = name;
        this.type = type;
        this.defaultValue = defaultValue;
        this.create = create;
    }

    public boolean isCreate() {
        return create;
    }

    public String getDefaultValue() {
        return defaultValue;
    }

    public String getName() {
        return name;
    }

    public String getType() {
        return type;
    }

}
 
Zuletzt bearbeitet:
1. Liest du bereits außerhalb von alles() den DAteinamen aus - und dann in alles gleich nochmal, das ist einmal überflüssig.

BufferedReader b = new BufferedReader(new FileReader ("C:\\streams.txt"));
String xmlDateiName;
while ((xmlDateiName = b.readLine()) != null)
{
p.print(alles("<Pid>",xmlDateiName) + ", ");


2. Eine Funktion hat nur einen Rückgabewert. Du gehts in alles zwar alle Text-Dateien durch, am Ende steht aber nur der Wert in ausgabe. Und das ist der Wert der letzten Datei, die durchsucht wurde.
 
Moin!
Du solltest vielleicht zusätzliche APIs wie JDOM http://www.jdom.org/ nutzen
Die würden dir das Leben bezüglich Lesen einer XML Datei erheblich vereinfachen..

*grüssle*
MeinerEiner
 
Hallo Danke für die schnellen Antworten.

@shutdown: Danke des wars. Aber in meiner neuen ausgabe.txt steht immer noch nur ein Eintrag.

Sprich wenn ich es in der Controlbox ausgebe gehts, aber sobald ich es in eine TXT datei (hier ausgabe.txt) reinschreiben will gibt er mir nur die letzte zeile raus. Ich meine das er ja in die schleife geht und immer wieder die Datei überschreibt aber wie verhindere ich das so das erimmer wenn er eine XML gelesen hat in die nächste Zeile der TXT reinschreibt.

Ich weiß Ich hätte des Lieber mit dem DOM oder SAX Parser machen sollen aber mir gings hier mehr um das routinierte einlesen von vielen Files da ich damit nicht nur XML Files einlesen will. Somit kann ich auch andere Files nach den Kriterien duchsuchen.

Aber Danke an alle.

Gruß
Thomas
 
Zuletzt bearbeitet:
Gib mal im Konstruktor des Printwriters als zusätzlichen Parameter true mit an - append oder nicht append, das ist hier die Frage und wird durch diesen Parameter geklärt.
 
Zurück