JDOM/XML-schreiben ... Problem mit Struktur

NapaZero

Grünschnabel
Hallo zusammen!

Da dies mein erster Post hier ist und ich erst seit 3 Wochen Java e, bitte ich um Nachsicht, wenn ich Formationsfehler mache, oder mich n bissl Laienhaft und evtl. unverständlich Ausdrücke.

Ich will/muss einen Parser schreiben, der mir aus *.java Files einen Tree erzeugt.
Das Parsen der Files geht hervorragend, auch die Rekursion macht das, was ich will ...
ABER: sobald ich die Daten via JDOM in eine XML-File schreiben will, fangen meine Probleme an.

Ich versuch zu erklären, wie meine Struktur auszusehen hat:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<wurzel>
  <BO-Partner>
    <psfs-Partnernr />
    <psfs-Partnerart />
    <psfs-Anrede />
    <psfs-Vorname />
    <psfs-Nachname />
    <psfs-Geburtsdatum />
    <psfs-Anzahl_Bankverbindung />
    <psfs-Anzahl_Bankverbindung_Exkasso />
    <psfs-Anzahl_Bankverbindung_Privat />
    <psfs-Neuanlage_Partner />
    <psfs-Neuanlage_ />
    <BC-Adressdaten>
      <psfs-Straße />
      <psfs-Hausnummer />
      <psfs-Land />
      <psfs-Postleitzahl />
      <psfs-Ort />
    </BC-Adressdaten>
    <BC-Bankverbindungen>
      <psfs-Kontoart />
      <psfs-Bank />
      <psfs-Bankleitzahl />
      <psfs-Kontonummer />
    </BC-Bankverbindungen>
  </BO-Partner>
  <BO-Vertrag />
</wurzel>

Diese XML-File hab ich allerdings mit Hand erstellt, so sollte es Final aussehen!

Die jetzige XML-File sieht so aus:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<wurzel>
  <BO-Partner>
    <psfs-Partnernr />
    <psfs-Partnerart />
    <psfs-Anrede />
    <psfs-Vorname />
    <psfs-Nachname />
    <psfs-Geburtsdatum />
    <psfs-Anzahl_Bankverbindung />
    <psfs-Anzahl_Bankverbindung_Exkasso />
    <psfs-Anzahl_Bankverbindung_Privat />
    <psfs-Neuanlage_Partner />
    <psfs-Neuanlage_ />
    <BC-Adressdaten>
      <BC-Adressdaten />
      sdfsdfds
    </BC-Adressdaten>
    <psfs-Straße />
    <psfs-Hausnummer />
    <psfs-Land />
    <psfs-Postleitzahl />
    <psfs-Ort />
    <BC-Bankverbindungen>
      <BC-Bankverbindungen />
      sdfsdfds
    </BC-Bankverbindungen>
    <psfs-Kontoart />
    <psfs-Bank />
    <psfs-Bankleitzahl />
    <psfs-Kontonummer />
  </BO-Partner>
  <BO-Vertrag />
</wurzel>

Wie man hoffentlich sieht, haben die psfs, die zu den "BCs" gehören, noch BO-Partner als Parent.
Und hier meine Frage:
Wie bekomm ich die "BCs" als Parent?

Hier mein Code (schlimm und chaotisch, sry):

Code:
package src;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import org.jdom.Element;

public class SaveStructureXML {

	static Element root = new Element("wurzel");
	Element children = null;
	static Element bcchildren = null;
	String aktuelleBC=null;
	Element psfs1 = null;
	Element psfs2 = null;
	
	public Element getStructure(String pfade) throws IOException {

		// boolean dir = true;
		String aktuellerPfad = pfade;
		int index = 0;
		int psfsindex = 0;
		int bcindex = 0;
		int Elindex = 0;
		String token = null;
		String tokenpsfs = null;
		String tokenele = null;
		String eletoken = null;
		FileReader file = null;
		BufferedReader reader = null;
		
//		List children = root.getChildren();
//		System.out.println(children);
//		
//		 root.addContent(new
//		 Element("bo").addContent("bo-psfs").addContent(new
//		 Element("bo-bc").addContent("bc-psfs")));//grobstruktur
	
		File datei= new File(aktuellerPfad);
		file = new FileReader(aktuellerPfad);
		reader = new BufferedReader(file);
		index = 0;
		Elindex = 0;
		psfsindex = 0;
		boolean eoff = false;
		boolean botrue = false;
		
		while (!eoff) {

			String line = reader.readLine();
			if (line == null) {
				eoff = true;
			} else {

				/*
				 * bosuche
				 */
				
				if (line.contains("@BusinessObject") && botrue==false) {

					if (line.contains("(displayName=")
							|| line.contains("( displayName=")) {
						StringTokenizer st = new StringTokenizer(line, "\"");
						while (st.hasMoreTokens()) {
							index++;
							token = st.nextToken();
							if (index == 2) {
								break;
							}
						}
					}
					root.addContent(new Element("BO-"
									+ token.replace(" ", "_")));
					botrue=true;
				}
				/*
				 * Elementsuche
				 */

				else if (line.contains("@Element") && line.contains("displayName=")) {
					if (line.contains("displayName=")) {
						StringTokenizer Elst = new StringTokenizer(line, "\"");
						while (Elst.hasMoreTokens()) {
							Elindex++;
							tokenele = Elst.nextToken();
							if (Elindex == 2) {
								Elindex = 0;
								break;
							}
						}// Ende Token
					}// ende Token-if
					System.out.println("--------------------->Anfang von BC-"+tokenele);
					bcindex++;
					aktuelleBC="BC-" + tokenele.replace(" ", "_");
					Element ele = new Element("BC-" + tokenele.replace(" ", "_"));
					Element bcele = new Element("BC-" + tokenele.replace(" ", "_"));
					eletoken = tokenele.toLowerCase();
					children = root.getChild("BO-Partner");
					children.addContent(ele.addContent(bcele));
					bcchildren = root.getChild("BO-Partner").getChild(aktuelleBC);
					bcchildren.addContent("sdfsdfds");
					
					/*
					 * BC-java öffnen
					 */

					getStructure(datei.getParent()+"\\BC"+tokenele+".java"); //rekursiver Aufruf
//					System.out.println(psfs1);
				}

				/*
				 * psfssuche
				 */

				else if (line.contains("public static final String")) {
					
					StringTokenizer psfsst = new StringTokenizer(line, "\"");
					while (psfsst.hasMoreTokens()) {
						Elindex++;
						tokenpsfs = psfsst.nextToken();
						if (Elindex == 2) {
							Elindex = 0;
							break;
						}
					}// Ende Token
					// System.out.println(token);
					System.out.println(tokenpsfs);
					psfsindex++;
					psfs1 = new Element("psfs-"
							+ tokenpsfs.replace(" ", "_"));
					psfs2 = new Element("psfs-"
							+ tokenpsfs.replace(" ", "_"));
					
					children = root.getChild("BO-Partner");
					children.addContent(psfs1);
				}
				
			}

		}
		reader.close();
		return root;
	}

	public List listOfPaths(String zielordner) throws IOException {

		List<String> list = new ArrayList<String>();
		File fil = new File(zielordner);
		BufferedReader reader = null;
		if (fil.isDirectory()) {
			String fils[] = fil.list();
			for (int i = 0; i < fils.length; ++i) {
				String filtest = fils[i];
				filtest = fil.getAbsolutePath();
				fils[i] = filtest + "\\" + fils[i];
				String test = fils[i];
				FileReader file = new FileReader(test);
				reader = new BufferedReader(file);
				boolean eof = false;
				boolean botrue2 = false;
				while (!eof) {
					String line = reader.readLine();

					if (line == null) {
						eof = true;
					} else {
						if (line.contains("@BusinessObject")&&botrue2==false) {
							list.add(fils[i]);
							botrue2=true;
						}
					}
				}
				reader.close();

			}
		}

		return list;
	}
}

Und hier die Main:
Code:
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import src.SaveStructureXML;

public class ParserTestmain {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		List list = new ArrayList();
		SaveStructureXML getSourceClasses = new SaveStructureXML();
		Element root=null;
		XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
		FileOutputStream output = new FileOutputStream(
		"C:\\Dokumente und Einstellungen\\alzeitz\\Desktop\\JavaParser2.xml");
		
		list = getSourceClasses.listOfPaths(args[0]);
		
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
			root=getSourceClasses.getStructure((String) list.get(i));		
		}
		Document dokument = new Document(root);
		outputter.output(dokument, output);
		output.close();
		
		
	

	}

}

Ich hoffe inständig, das mir wer helfen kann, denn ich verzweifel grad n bissl :(

schonmal danke im vorraus


Alex aka NapaZero
 
Hey erstmal,
also ich finde der Code sieht an manchen Stellen etwas seltsam aus..
z.B.:
Hier wird bei der "bosuche" aus irgendeinem Grund zweimal das gleiche abgefragt:

Code:
if (line.contains("(displayName=") || line.contains("( displayName=")) {
...
}

genauso hier in der "Elementsuche":

Code:
else if (line.contains("@Element") && line.contains("displayName=")) {
	if (line.contains("displayName=")) {
                      ....
                     }
...
}


Ansonsten würde ich dir noch empfehlen, eine DTD einzubinden...kann sehr hilfreich sein :D

Dein Problem hört sich schlicht nach einem "Bedingungsfehler" an...ich würde dir empfehlen, das ganz mal zu debuggen und die Werte zu überprüfen,...dann wirste da irgendwo etwas finden...mehr kann ich dir dazu leider nicht sagen...

Viel Erfolg :)

Gruss


Buschiii
 
Zurück