Menüeinträge aus XML erzeugen

Status
Nicht offen für weitere Antworten.
S

Shuk

Gast
Hallo an alle,

ich möchte gerne eine Menüstruktur erstellen und die einzelnen Menüpunkte aus einer XML-Datei lesen.
Ich bin nun soweit, dass mir der Inhalt des gesamten XML Dokumentes aufgelistet wird. Benutzt habe ich dazu die Methoden des SAX Parsers.

Meine XML-Datei gliedert sich folgendermaßen:
Code:
<gui>

    <menu>
		Menupunkt 1
		<menuItem>Untermenupunkt 1</menuItem>
		<menuItem>Untermenupunkt 2</menuItem>
		<menuItem>Untermenupunkt 3</menuItem>
		<menuItem>Untermenupunkt 4</menuItem>
    </menu>

    <menu>
		Menupunkt 2
		<menuItem>Untermenupunkt 1</menuItem>
		<menuItem>Untermenupunkt 2</menuItem>
		<menuItem>Untermenupunkt 3</menuItem>
		<menuItem>Untermenupunkt 4</menuItem>
    </menu>

...usw.

</gui>

Meine Ausgabe (wenn ich die Tags nicht ausgeben lasse), sieht dann so aus:
Code:
Menupunkt 1
Untermenupunkt 1
Untermenupunkt 2
Untermenupunkt 3
Untermenupunkt 4

Menupunkt 2
Untermenupunkt 1
Untermenupunkt 2
Untermenupunkt 3
Untermenupunkt 4

... usw.

Jetzt ist meine Frage, wie kann ich diese Daten am besten und leichtesten so strukturieren, dass ich für jeden Menupunkt ein Objekt bekomme und dieses Objekt wiederum auf seine Untermenpunkte in Form von verketteten Objekten verweist? Also wie ich eine verkettete Liste mache, ist mir schon klar, aber wie weise ich die Daten zu, wann er was macht? Hoffe ihr versteht was ich meine.

Wie mein Code aussieht, könnt ihr hier sehen, da hab ich mich dran orinentiert:
http://www.torsten-horn.de/techdocs/java-xml.htm#Programmierbeispiel-SAX-Echo

Am 1. SAX-Programmierbeispiel:
XML einlesen und Elemente, Attribute und Textinhalte ausgeben


Ok, hoffe ihr könnt mir da schnell weiterhelfen, wäre super!


Danke und Gruß
Shuk
 
S

Shuk

Gast
Hi, danke für die schnelle Antwort.
Was du da gemacht hast, sieht mal wirklich gut aus!

So ganz nachvollziehen kann ich den ganzen Code aber noch nicht :roll:

Kann ich im XML-Code explizit angeben, was jetzt der Menupunkt ist und was die dazugehörigen Unterelemente sind?
Und der Name der Menupunkte ist ja da ein Attribut, kann ich da dann auch Menupunktnamen reinschreiben, die Leerzeichen enthalten?

Das wären so die Fragen, die sich mir stellen, bevor ich mich weiter in den Code reindenke. Kannst du mir ja sicher schnell beantworten :D


Gruß
Shuk
 
R

Roar

Gast
jo kannst du...
der gröbste unterschied ist wohl, dass der source da mit Actions (javax.swing) arbeitet (d.h. es passiert auch was wenn du die items anklickst ;)) darum sieht das etwas anders aus...
 
S

Shuk

Gast
Also mit den Actions ist schon gut, die brauch ich ja auch dann :)

Hab jetzt mal den Code kopiert und wollte mal ausprobieren, hab da aber noch ein paar Fehler drin wie es aussieht.

1) Mit dieser Importanweisung hat er Probleme, was kann/muss ich da ändern?

Code:
import org.jdom.Element;
import org.jdom.Attribute;

2) Die Actionklassen, wie kann ich die denn alle in eine Datei schreiben? Oder muss da für jede Klasse wieder ne eigene Datei angelegt werden? So wie es da steht, geht es nicht...

Code:
package xmledit.gui.actions;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;


public class HelpAction extends AbstractAction {

   public HelpAction() {
      putValue(NAME, "Help");
   }

   public void actionPerformed(ActionEvent e) {
      System.out.println("help");
   }
}

public class ExitAction extends AbstractAction {

   public ExitAction() {
       putValue(NAME, "Exit");
       putValue(MNEMONIC_KEY, new Integer((int)'E'));
   }

   public void actionPerformed(ActionEvent e) {
      System.out.println("exit");
   }
}

public class AboutAction extends AbstractAction {

   public AboutAction() {
   }

   public void actionPerformed(ActionEvent e) {
      System.out.println("about");
   }
}


3) Dann hab ich noch ne Klasse mit der Mainmethode angelegt, da findet er aber die Funktion setJMenuBar() nicht:
Code:
public class XMLGui {

	public static void main(String[] args) {
		XMLMenuBar xmb = XMLMenuBar.load(getClass().getResource("MenuBar.xml"));
        setJMenuBar(xmb.createJMenuBar()); 
	}
}


Kannst du mir da bitte nochmal weiterhelfen?
Und wie genau kann ich dann da Untermenüs anlegen, den Post im Originalbeitrag verstehe ich irgendwie nicht.


Danke
Shuk
 
R

Roar

Gast
zu 1. wie gesagt die klassen verwenden jdom, kansnt du hier runterladen: www.jdom.org

zu 2. nein die musst du alle in verschiedene dateien schreiben

3. :autsch: hörmal wenn du gar kein fenster hats, wo willst du dieie menüleiste hinsetzen?

untermenüs gehen so (steht doch auch im thread):

Code:
<menu name="File" mnemonic="F">
    <menu name="New">
          <action class="xmledit.gui.actions.NewAction"/>
     </menu>
     <separator/>
     <action class="xmledit.gui.actions.ExitAction"/>
</menu>
 
S

Shuk

Gast
hm, ok, noch ne dumme Frage :)

wo muss ich die jdom Sachen hinkopieren? Gibts da nen Standardordner?
 
S

Shuk

Gast
Irgendwie finde ich nicht die Antwort, die ich suche. Vielleicht suche ich auch falsch, keine Ahnung. Kannst du es mir schnell beschreiben oder nen Link geben? Wäre echt nett!
 
S

Shuk

Gast
Ok, habs hinbekommen :D
Melde mich dann wieder bei weiteren Fragen, hoffe ihr habt noch was Geduld :roll:

Auf jeden Fall schonmal vielen Dank!
 
S

Shuk

Gast
Hi,

also ich habe es jetzt soweit hinbekommen, dass mir Eclipse mal keine Fehler mehr anzeigt. Allerdings bekomme ich folgenden Fehler wenn ich das Programm starte:

Code:
Exception in thread "main" java.lang.NullPointerException
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:809)
	at gui_1.XMLMenuBar.load(XMLMenuBar.java:46)
	at gui_1.XMLGui.<init>(XMLGui.java:58)
	at gui_1.XMLGui.main(XMLGui.java:80)

Meine Main-Methode sieht so aus:

Code:
// MAIN
	public static void main(String[] args) throws Exception 
	{
		XMLGui myGUI = new XMLGui();
		
		// Fenstereigenschaften setzen:
		myGUI.setWindowProperties();
		
		// Menue anzeigen:
		myGUI.show();
	}

Und der Konstruktor so:

Code:
// Konstruktor
	public XMLGui() throws Exception
	{
		// Anwendungsname setzen
		super(lblAppName);
		
		// Set up the GUI.
	    desktop = new JDesktopPane(); //a specialized layered pane
	
	    //this.createFrame(); //create first "window"
	    this.setContentPane(desktop);
	    
	    XMLMenuBar xmb = XMLMenuBar.load(getClass().getResource("MenuBar.xml"));
        this.setJMenuBar(xmb.createJMenuBar()); 
	}

Die Datei MenuBar.xml ist auch vorhanden.

Die anderen Methoden habe ich sonst eigentlich übernommen...
Eine Idee was da falsch läuft?


Gruß
Shuk
 
S

Shuk

Gast
Also beim Debuggen tritt der Fehler in der folgenden Methode der Datei XMLMenuBar.java auf:

Code:
public static XMLMenuBar load(URL u) throws JDOMException, IOException {
      Document d = new SAXBuilder().build(u);
      Element root = d.getRootElement();
      if(!root.getName().equals("menubar"))
         throw new IllegalArgumentException("Document is not a menubar definition");
      XMLMenuBar mb = new XMLMenuBar();
        List menus = root.getChildren("menu");
        for(int i = 0; i<menus.size(); i++) {
           Element el = (Element) menus.get(i);
           mb.addMenu(XMLMenu.createXMLMenu(el));
      }
      return mb;
   }

Und zwar gleich in der ersten Zeile:

Code:
Document d = new SAXBuilder().build(u);


Wird da irgendwie der Pfad nicht richtig übergeben oder muss ich den anders setzen?
Bitte um Hilfe!


Gruß
Shuk
 
R

Roar

Gast
liegt die MenuBar.xml im selben verzeichnis wie die XMLGui.class ?
 

Shuk

Mitglied
hm, nicht direkt. Ich hab in Eclipse mein Projekt und in diesem Ordner liegt sie dann drin. Die Java-Dateien liegen dann nochmal in einem Unterordner /src/packagename/
Kann es daran liegen? Hab auch schonmal nen absoluten Pfad eingegeben, hat aber nicht gebracht.
 
R

Roar

Gast
ja dann musst du die xml auch in den richtigen pfad legen, oder den pfad im code anpassen
 

Shuk

Mitglied
hm, hab sie jetzt mal zu den .class Dateien kopiert. Jetzt kommt allerdings ne andere Fehlermeldung:

Code:
Exception in thread "main" org.jdom.input.JDOMParseException: Error on line 2 of document file:/E:/eclipse-workspace/gui/bin/gui_1/MenuBar.xml: The processing instruction target matching "[xX][mM][lL]" is not allowed.
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:465)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:810)
	at gui_1.XMLMenuBar.load(XMLMenuBar.java:46)
	at gui_1.XMLGui.<init>(XMLGui.java:58)
	at gui_1.XMLGui.main(XMLGui.java:80)
Caused by: org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed.
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPIData(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanPIData(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPI(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:453)
	... 4 more
Caused by: org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed.
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPIData(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanPIData(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPI(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:453)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:810)
	at gui_1.XMLMenuBar.load(XMLMenuBar.java:46)
	at gui_1.XMLGui.<init>(XMLGui.java:58)
	at gui_1.XMLGui.main(XMLGui.java:80)
Hast du da ne Idee zu der kleinen Fehlermeldung :roll:
 

Shuk

Mitglied
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<menubar>
   <menu name="File" mnemonic="F">
      <menu name="New">
         <action class="xmledit.gui.actions.ExitAction"/>
      </menu>
      <separator/>
       <action class="xmledit.gui.actions.ExitAction"/>
   </menu>
   <menu name="Help" mnemonic="H">
       <action class="xmledit.gui.actions.HelpAction" enabled="false"/>
       <separator/>
       <action class="xmledit.gui.actions.AboutAction">
           <property key="Name" value="About"/>
       </action>
   </menu>
</menubar>

Hab ich eigentlich erstmal genau so übernommen...

Müssen bei diesen Angaben "<action class="xmledit.gui.actions.ExitAction"/> " irgndwelche Ordnerstrukuren so vorhanden sein?

Hast du von dem Teil vielleicht noch ne lauffähige Version, die du mir mal schicken könntest?
 
R

Roar

Gast
mach mal die leerzeile vor der pi weg.
das attribut class zeigt auf die entsprechende klasse, die mus snatürlich vorhanenden sein...
 

Shuk

Mitglied
ok, es geht wohl voran :)
Jetzt ne andere Fehlermeldung:

Code:
Exception in thread "main" java.lang.ClassNotFoundException: xmledit.gui.actions.ExitAction
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at gui_1.XMLAction.createAction(XMLAction.java:68)
	at gui_1.XMLMenu.createJMenu(XMLMenu.java:86)
	at gui_1.XMLMenu.createJMenu(XMLMenu.java:83)
	at gui_1.XMLMenuBar.createJMenuBar(XMLMenuBar.java:70)
	at gui_1.XMLGui.<init>(XMLGui.java:59)
	at gui_1.XMLGui.main(XMLGui.java:80)

XML-Code sieht jetzt so aus:

Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<menubar>
   <menu name="File" mnemonic="F">
      <menu name="New">
         <action class="xmledit.gui.actions.ExitAction"/>
      </menu>
      <separator/>
       <action class="xmledit.gui.actions.ExitAction"/>
   </menu>
   <menu name="Help" mnemonic="H">
       <action class="xmledit.gui.actions.HelpAction" enabled="false"/>
       <separator/>
       <action class="xmledit.gui.actions.AboutAction">
           <property key="Name" value="About"/>
       </action>
   </menu>
</menubar>

Anscheinend kommt er nicht mit dem xmledit... klar. Ich habe halt auch keine Ordner die so heißen, liegt da der Fehler? Wenn ja, wie müsste denn die Ordnerstruktur genau heißen wo dann welche Dateien liegen?

Nachtrag:

Liegt wirklich an den Actions, irgendwie hab ich da wohl keine passende Struktur. Hab die ganzen actions mal auskommentiert und jetzt geht es. Muss ich also die noch irgendwie anpassen, dann sollte es auch mit den Actions gehen.

Allerdings noch ne Frage:
Wenn ich jetzt Untermenüpunkte anlege, dann erscheint da immer noch so ein Pfeil rechts neben der Bezeichnung. Wie kriege ich den denn weg?
 
R

Roar

Gast
uff. du musst auch shcon die richite klasse angeben. die datei die ich gepostet hab war ein Beispiel!

bei untermenüpunkten ist rechts imemr ein pfeil. egal ob du die manuell anlegst und egal ob metal win oder sonstwas look and feel :-/
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Erzeugen einer openapi spec via swagger XML & JSON 1
W Erzeugen einer Handlerklasse zum Abfangen von SOAP-Requests XML & JSON 13
J Object in JSON Datei einlesen und als neues Object erzeugen (in ein Object Array) XML & JSON 29
A GUI um auf XSD Basis (valide) XML Daten zu erzeugen XML & JSON 3
C XML erzeugen Tipps und Tricks XML & JSON 7
M JAXB versucht abstrakte Klasse zu erzeugen XML & JSON 7
J XML Parser anhand xsd erzeugen XML & JSON 2
A Fehler beim Erzeugen eines XML-Schema XML & JSON 4
H PDF erzeugen mit FOP(fo fehlerhaft) XML & JSON 2
S JDOM ohne XML Header erzeugen? XML & JSON 2
R XSD aus Java Klassen erzeugen?? XML & JSON 2
S Aus XML-File eine Baumstruktur erzeugen XML & JSON 5
P cxf: WSDL dynamisch erzeugen (zur Laufzeit) XML & JSON 7
F XML erzeugen aus JTree und wieder einlesen... XML & JSON 6
N Teilbaum aus DOM-Baum erzeugen XML & JSON 5
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
S Java - Klassen erzeugen aus xsd bzw. wsdl XML & JSON 3
J Objektstruktur aus XML-Datei erzeugen XML & JSON 21
T Einzug bei XSLTransformator erzeugen XML & JSON 3
P XSD Schema: Konstanten mit "fixed" erzeugen geht nicht ??? XML & JSON 3
G Welche Klassen zum erzeugen/auslesen eines XML Files verwend XML & JSON 9
B jdom document aus string erzeugen? XML & JSON 1
H PDFs erzeugen mit Apache FOP XML & JSON 3
D XML Datei mit DOM erzeugen XML & JSON 6
G JAXB Objekte erzeugen XML & JSON 3
E XOM setzen von XML-Schema declaration beim erzeugen XML-File XML & JSON 2
B DTD aus Java erzeugen XML & JSON 2
M PDF erzeugen aus Stringarray XML & JSON 1
G XML Dokument mit DOM erzeugen XML & JSON 9
S svg erzeugen XML & JSON 2
B org.w3c.dom.Node erzeugen XML & JSON 2
B XML-Document mit Java erzeugen und zuruecksenden XML & JSON 1
K xml Datei mit JDOM erzeugen, Problem Namespaces XML & JSON 1

Ähnliche Java Themen

Neue Themen


Oben