Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Antwort
 
Themen-Optionen
Alt 14.07.2005, 09:19   Nach oben    #1
nove
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 243
Standard xml parsing

ist mir ja schon fast peinlich so eine frage zu stellen. Aber ich glaube ich brauche jetzt mal kurz einen Denkanstoss!

ich möchte eine XML Datei Parsen uns zwar sieht die xml Datei wie folgt aus:
Code:
<?xml version="1.0" encoding="UTF-8"?>

<!--
	Document   : module.xml
	Created on : 13. Juli 2005, 07:33
	Author	 : nove
	Description:
		Purpose of the document follows.
-->
<elements>
	<modul>
			<modulname>Modul1</modulname>
			<button>
				 <title>Beschriftung Button</title>
				 <class>Class to call</class>
				 <image>imagefilename</image>
			</button>

			<button>
				 <title>Beschriftung Button</title>
				 <class>Class to call</class>
				 <image>imagefilename</image>
			</button>

			<button>
				 <title>Beschriftung Button</title>
				 <class>Class to call</class>
				 <image>imagefilename</image>
			</button>

			<button>
				 <title>Beschriftung Button</title>
				 <class>Class to call</class>
				 <image>imagefilename</image>
			</button>

			<button>
				 <title>Beschriftung Button</title>
				 <class>Class to call</class>
				 <image>imagefilename</image>
			</button>
	</modul>

	<modul>
			<modulname>Modul2</modulname>
			<button>
				 <title>Beschriftung Button</title>
				 <class>Class to call</class>
				 <image>imagefilename</image>
			</button>

			<button>
				 <title>Beschriftung Button</title>
				 <class>Class to call</class>
				 <image>imagefilename</image>
			</button>
	</modul>
</elements>
Dies soll später mal dazu dienen Buttons in einer Buttonbar automatisch zu erzeugen in dem ich in die XML Datei die Button-Beschriftung, aufzurufende Klasse und das Icon-File für den Button angebe. Nun könnte ich ja das ganze über eine properties Datei machen aber ich finde XML schöner struckturiert. So nun zu meiner Frage:
Wie baue ich einen XML Parser der mir die Möglichkeit gibt auf die Inhalte der Elemente zuzugreifen (ich weiss, gehört zum Grundwissen über Java und XML) aber ich habe im Moment extremen Zeitmangel und sollte hier schnell zu einer Lösung kommen.

[edit] noch ein Nachtrag: ich möchte dann die Daten in eine Hashmap einlesen also für die keys z.B. modulname,titel, classtocall,imagefilename und als value der hashmap eben die Values der XML Elemente diese HashMaps möchte ich dann in einen Vector ablegen zur späteren Verwendung [edit ende]
nove ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.07.2005, 14:06   Nach oben    #2
pago
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
Standard

Sorry, aber so ganz verstanden habe ich dich wohl nicht...

Du könntest einen einfachen SAX Handler schreiben, oder dir nen DOM Tree basteln lassen, denn du dann abarbeitest. Sollte beides sehr einfach sein.
Wo genau ist das Problem?
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.07.2005, 17:41   Nach oben    #3
nove
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 243
Standard

Zitat:
Zitat von TheDragonMaster
Du könntest einen einfachen SAX Handler schreiben, oder dir nen DOM Tree basteln lassen, denn du dann abarbeitest. Sollte beides sehr einfach sein.
Wo genau ist das Problem?
Genau da! SaxHandler --> DOM Tree --> abarbeiten!
nove ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.07.2005, 18:03   Nach oben    #4
pago
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
Standard

Ungetestet und in ein paar Minuten zusammengewürfelt:
Code:
/*
 * Copyright 2005 Patrick Gotthardt
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.pagosoft.demo;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author Patrick Gotthardt
 */
public class ToolbarCreator extends DefaultHandler {
	private List moduleList;
	
	public ToolbarCreator() {
		moduleList = new ArrayList();
	}
	
	public void parse(InputStream stream) {
		try {
			SAXParserFactory.newInstance().newSAXParser().parse(stream, this);
			stream.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	// Real XML parsing stuff
	// helpers
	private StringBuffer content = new StringBuffer();
	private String currentProperty;
	private Modul currentModule;
	private Map currentButton;
	
	public void characters(char ch[], int start, int length) throws SAXException {
		content.append(ch, start, length);
	}

	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		// module-Tag means: Start a new collection of buttons
		if("modul".equals(qName)) {
			currentModule = new Modul();
		// button-Tag means: Start a new collection of button-items
		} else if("button".equals(qName)) {
			currentButton = new HashMap();
		// add a property to something
		} else {
			currentProperty = qName;
		}
	}

	public void endElement(String uri, String localName, String qName) throws SAXException {
		// module-Tag means: Finished the module
		if("modul".equals(qName)) {
			moduleList.add(currentModule);
			currentModule = null;
		// button-Tag means: Start a new collection of button-items
		} else if("button".equals(qName)) {
			currentModule.buttonList.add(currentButton);
			currentButton = null;
		// add a property to the module
		} else if(currentButton == null) {
			currentModule.properties.put(currentProperty, content.toString());
		} else {
			currentButton.put(currentProperty, content.toString());
		}
		// end of an element always means: restore the buffer
		content.delete(0, content.length());
	}
	
	// this class is needed to store the buttons as well as the properties of the module
	private class Modul {
		// I'm just lazy - don't do this in real!
		public List buttonList;
		public Map properties;
		
		public Modul() {
			buttonList = new ArrayList();
			properties = new HashMap();
		}
	}
}
Das musste dann aber immer noch durchgehen und in Toolbars umwandeln. Ich hätte es bevorzugt, dass sofort zu machen.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.07.2005, 07:40   Nach oben    #5
nove
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 243
Standard

ich glaube ich bin irgenwie vom Pferd gefallen und habe mir böse den Kopf gestossen aber mein "ichverstehe" Blickfeld ist gerade zero zero. :confused:

Nur nochmal für dein Verständniss was ich wissen sollte oder besser gesagt wie ich mir es vorstelle. Was ich am ende raushaben möchte ist folgendes

HashMap:
key
modulname
value
HashMap
key value
title Beschriftung Button
class Class to Call
image ImageFileName

key
modulname
value
HashMap
key value
title Beschriftung Button
class Class to Call
image ImageFileName


key
modulname
value
HashMap
key value
title Beschriftung Button
class Class to Call
image ImageFileName


und dieses dann schön in einen Vector verpackt zurück an den Absender.

Das heiss im Klartext für jeden Button möchte ich eine HashMap erzeugen die als key eben den Modulnamen trägt und als value wiederum eine HashMap die die Eigenschaften des Buttons enthält. Und das ganze möchte ich in einem Vector zurückgeben.

So stell ich mir das vor. Frag nicht warum, ich hab da was spezielles mit einer GUI vor nur steht gerade ein Elefant bei mir auf dem Schlauch. Sorry ich bin halt so ein "zeigmirwiesgehtdannversteheichesauch" Typ.
nove ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.07.2005, 10:02   Nach oben    #6
pago
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
Standard

Das Problem ist aber, dass ein Modul mehrere Buttons haben kann, deswegen habe ich da die "Modul"-Klasse hinzugefügt.
Der Rest ist genauso, wie von dir gewünscht.

Du bekommst eine Liste mit Modulen, die eine Liste von Maps enthält. Wenn's dir nur um den Vector geht: Es reicht, wenn du ArrayList und Vector vertauscht.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.07.2005, 11:20   Nach oben    #7
nove
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 243
Standard

Dat bekomme ich wenn ich meine xml Datei da durchjage.

java.lang.NullPointerException

Code:
currentModule.properties.put(currentProperty, content.toString());
nove ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.07.2005, 13:20   Nach oben    #8
pago
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
Standard

Ein bisschen Eigeninitiative bitte...

Suche:
Code:
		// add a property to the module
		} else if(currentButton == null) {
			currentModule.properties.put(currentProperty, content.toString());
		} else {
			currentButton.put(currentProperty, content.toString());
		}
Ersetze mit:
Code:
		// add a property to the module
		} else if(currentButton == null && currentModule != null) {
			currentModule.properties.put(currentProperty, content.toString());
		} else if(currentButton != null) {
			currentButton.put(currentProperty, content.toString());
		}
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.07.2005, 16:21   Nach oben    #9
nove
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 243
Standard

Sorry aber ich hab mir voher erst den Code genauer Anschauen können. Ich spiel gerade im Moment Feuerwehr (seit 3 Wochen) Gewitter und so. Ich bin zurzeit mehr damit beschäftigt neue Firewalls und Server auszuliefern. und meine Progis haben z.Zt. Urlaub deswegen stehe ich auch ein wenig auf dem Schaalauch.
nove ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.07.2005, 16:31   Nach oben    #10
pago
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
Standard

Wenn du nen freiberuflichen Programmierer brauchst, weißt du ja, wie du mich erreichen kannst.

Sag bescheit, ob es mit den Änderungen funktioniert.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.07.2005, 07:43   Nach oben    #11
nove
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 243
Standard Danke ich habs nun verstanden!

ok ich habe jetzt den parser begriffen. Vielen Dank nochmal.
nove ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
DB Backup als XML im ZIP Archiv ex³ PHP-Programmierung 4 13.09.2007 14:17
Bug im PEAR XML Parser? ex³ PEAR, PECL und Frameworks 11 15.02.2007 14:51
XML aus Datenbank lesen, verarbeiten Robinson HTML, XML und CSS 5 27.12.2005 20:30
XML Schema GUI Engine (JAXFront) spor Nachrichten 2 05.08.2004 17:27


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:22 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44