# XML in Jtree bearbeiten



## Mario170783 (8. Sep 2010)

Hallo zusammen,

Ich bin neu hier und brauch gleich mal was 

Ich würde gernen ein XML auslesen, es über ein JTREE anzeigen bzw. bearbeiten und dann wieder in eine XML Datei zurückschreiben. Über die Konsole bring ich das auch schon alles hin. Es fehlt mir eigentlich nur mehr die GUI - Umsetzung.

Das XML kann z.b so aussehen (Die Struktur bleibt immer gleich--> es werden nur Elemente gelöscht bzw. hinzugefügt)

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<AlarmConfig>
	<AlarmModule>

		<ALARM AttributeName="Alarmgenerierung_1.test" AlarmText="Anzeigentest" AlarmGroupIndex="1" Priority="100"/>
		<ALARM AttributeName="Alarmgenerierung_2.test" AlarmText="Anzeigentest" AlarmGroupIndex="2" Priority="200"/>
		<ALARM AttributeName="Alarmgenerierung_3.test" AlarmText="Anzeigentest" AlarmGroupIndex="3" Priority="300"/>
		<ALARM AttributeName="Alarmgenerierung_4.test" AlarmText="Anzeigentest" AlarmGroupIndex="4" Priority="400"/>

	</AlarmModule>

	<AlarmGruppen>
		<ALARMGROUP Group="Alarmgenerierung_1" TextAttribute="G,S,L," AlarmGroupIndex="1"/>
		<ALARMGROUP Group="Alarmgenerierung_2" TextAttribute="R,T,L," AlarmGroupIndex="2"/>
		<ALARMGROUP Group="Alarmgenerierung_3" TextAttribute="O,T,L,"  AlarmGroupIndex="3"/>
		<ALARMGROUP Group="Alarmgenerierung_4" TextAttribute="G,T,L," AlarmGroupIndex="4"/>

	</AlarmGruppen>

</AlarmConfig>
[/XML]
Um das ganze zu laden hab ich eine Loader Klasse geschrieben die mir ein Jdom.Doc zurückliefert:

```
package xml;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.jdom.*;
import org.jdom.input.SAXBuilder;

public class XmlLoader {

	
	private String path;
	private Document doc;
	
	public XmlLoader(String p ){
		this.path = p;
		
	}
	
	public Document getJdomDocument(){
		
		File fin = new File(this.path);
		InputStream is = null;
		try {
			is = new BufferedInputStream(new FileInputStream(fin));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		
		SAXBuilder builder = new SAXBuilder();
		try {
			this.doc = builder.build(is);
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return doc;
	}
	

}
```
[/XML]


Eine Handler Klasse bekommt eben dieses Doc übergeben und kann damit dann gewisse Aktionen ausführen (Gruppen auslesen, Löschen, hinzufügen etc...)


```
package xml;

import java.util.ArrayList;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;

public class XmlHandler {
	
	private Document doc;
	private Element root;
	private List<Element> AlarmModule = new ArrayList<Element>();
	private List<Element> AlarmGroups = new ArrayList<Element>();
	
	
	public XmlHandler(Document d){
		this.setJdomDoc(d);
		this.root = doc.getRootElement();
		this.AlarmModule = root.getChild("AlarmModule").getChildren();
		this.AlarmGroups = root.getChild("AlarmGruppen").getChildren();
	}

	public void setJdomDoc(Document doc) {
		this.doc = doc;
		this.root = doc.getRootElement();
		this.AlarmModule = root.getChild("AlarmModule").getChildren();
		this.AlarmGroups = root.getChild("AlarmGruppen").getChildren();
	}

	public Document getJdomDoc() {
		return doc;
	}
	
	public Element getRootElement(){
		return this.doc.getRootElement();
	}
	
	public List<Element> getAlarmGroups() {
		return this.AlarmGroups;
		
	}
	
	public List<Element> getAlarmModules(){
		return this.AlarmModule;
	}
	
	public void AddAlarmModule(String name, String alarmtext,
								int alarmgroupindex, int priority) throws UnknownAlarmModuleException{
		
		if((name == "") || alarmtext == "" || alarmgroupindex <= 0 || alarmgroupindex >= 20 || priority <= 0 || priority >= 500){
			throw new UnknownAlarmModuleException();
		}
		else
		{
		
			Element el = new Element("ALARM").setAttribute("AttributeName", name).
												setAttribute("AlarmText", alarmtext).
												setAttribute("AlarmGroupIndex",Integer.toString(alarmgroupindex)).
												setAttribute("Priority", Integer.toString(alarmgroupindex));
			this.root.getChild("AlarmModule").addContent(el);
		}
	}
	
	public void AddAlarmGroup(String name, String textatt, int alarmgroupindex)
			 throws UnknownAlarmModuleException{

		if((name == "") || textatt == "" || alarmgroupindex <= 0 || alarmgroupindex >= 20 ){
			throw new UnknownAlarmModuleException();
		}
		else
		{
			Element el = new Element("ALARMGROUP").setAttribute("Group", name).
													setAttribute("TextAttribute", textatt).
													setAttribute("AlarmGroupIndex",Integer.toString(alarmgroupindex));
			this.root.getChild("AlarmGruppen").addContent(el);
		}
	}

	public List<Element> getAlarmModulesByName(String name){
		//gibt eine ArrayList mit allen Elementen zurück die den übergebenen Modulnamen besitzen
		List<Element> list = new ArrayList<Element>();
		List<Element> filter = new ArrayList<Element>();
		Element helpelement = new Element("HelpElement");
		helpelement.setAttribute("AttributeName", name);
		
		list =this.getAlarmModules();
		for (Element element : list) {
			if(element.getAttribute("AttributeName").toString()
					.equals(helpelement.getAttribute("AttributeName").toString())){
			
			filter.add(element);
			}
		}
		
		return filter;
		
	}

	public List<Element> getAlarmModulesByPrio(int prio){
		//gibt eine ArrayList mit allen Elementen zurück die die übergebene Prioritaet besitzen
		List<Element> list = new ArrayList<Element>();
		List<Element> filter = new ArrayList<Element>();
		Element helpelement = new Element("HelpElement");
		helpelement.setAttribute("Priority", Integer.toString(prio));
		
		list =this.getAlarmModules();
		for (Element element : list) {
			if(element.getAttribute("Priority").toString()
					.equals(helpelement.getAttribute("Priority").toString())){
			
			filter.add(element);
			}
		}
		
		return filter;
	
	}
	
	public List<Element> getAlarmModulesByGroup(int group){
		//gibt eine ArrayList mit allen Elementen zurück die die übergebene Alarmgruppe besitzen
		List<Element> list = new ArrayList<Element>();
		List<Element> filter = new ArrayList<Element>();
		Element helpelement = new Element("HelpElement");
		helpelement.setAttribute("AlarmGroupIndex", Integer.toString(group));
		
		list = this.getAlarmModules();
		for (Element element : list) {
			if(element.getAttribute("AlarmGroupIndex").toString()
					.equals(helpelement.getAttribute("AlarmGroupIndex").toString())){
			
			filter.add(element);
			}
		}
		
		return filter;
		
	}
	
	public List<Element> getAlarmGroupsByGroup(int group){
		//gibt eine ArrayList mit allen Elementen zurück die die übergebene Alarmgruppe besitzen
		List<Element> list = new ArrayList<Element>();
		List<Element> filter = new ArrayList<Element>();
		Element helpelement = new Element("HelpElement");
		helpelement.setAttribute("AlarmGroupIndex", Integer.toString(group));
		
		list = this.getAlarmGroups();
		for (Element element : list) {
			if(element.getAttribute("AlarmGroupIndex").toString()
					.equals(helpelement.getAttribute("AlarmGroupIndex").toString())){
			
			filter.add(element);
			}
		}
		
		return filter;
		
	}
	
	public void deleteAlarmModule(List<Element> list){
		
		for(Element el : list ){
			this.root.getChild("AlarmModule").removeContent(el);
		}		
	}
	
	public void deleteAlarmGroups(List<Element> list){
		
		for (Element el : list){
			this.root.getChild("AlarmGruppen").removeContent(el);
		}
	}
}
```

Der Saver speichert das DOC dann wieder in eine Datei:

```
package xml;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;


import org.jdom.*;
import org.jdom.output.XMLOutputter;

public class XmlDocWriter {
	
	private String path;
	private Document doc;
	
	public XmlDocWriter(Document d){
		this.doc = d;		
	}

	public boolean WriteDocToFile(String p){
		this.path = p;
		File fout = new File(this.path); 
		try {
			XMLOutputter out = new XMLOutputter();
			OutputStream fos = new FileOutputStream(fout);
			out.output(this.doc, fos);
			
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		catch (IOException e){
			e.printStackTrace();
		}
		return true;	
	}
}
```

Wie schon gesagt mir fehlt einfach der Ansatz das in ein JTREE Element zu verpacken bzw. da verarbeiten zu können!:bahnhof: Vlt. kann mir ja jemand einen kleinen Tipp geben 

Besten Dank,
Mario


----------



## eRaaaa (8. Sep 2010)

Kann nicht wirklich etwas dazu beitragen, aber:


Mario170783 hat gesagt.:


> Vlt. kann mir ja jemand einen kleinen Tipp geben



Ist zwar schon etwas älter, aber folgendes könnte dir evtl. weiterhelfen:
http://www.java-forum.org/codeschnipsel-u-projekte/7295-jxmltree.html

Über google findet man auch so einiges, z.B. How to display XML in a JTree using JDOM (Java source code)

p.s.: Strings besser mit equals vergleichen ,bzw. es gibt auch die Methode isEmpty()


----------



## Mario170783 (8. Sep 2010)

Danke erstmal für den Tipp. Werd mir das gleich mal anschauen! 
Wegen des Stringvergleichs: Das war noch eine alte Version in der neuen hab ich es schon richtig! Damals hatte ich es noch nicht so mit Referenzen.. 

mfG,
Mario


----------

