XML --- Daten ausgeben

Status
Nicht offen für weitere Antworten.

megachucky

Bekanntes Mitglied
ich komm mal wieder mit nem ganz einfachen einstiegs-problem nicht weiter.

habe folgende XML datei:

Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<buch 
  auflage="2">

  

  <titel>C für Windows</titel> 
  <autor>
    <name>Erlenkötter</name> 
    <vorname>Helmut</vorname> 
  </autor>
  <autor>
    <name>Reher</name> 
    <vorname>Volker</vorname> 
  </autor>
  <verlag>Rowohlt</verlag> 
  <isbn>3-499-19234-9</isbn> 
  <seiten>240</seiten>
</buch>

der java code ist:


Code:
package test;

import java.io.*;         // 1
import org.xml.sax.*;     // 2
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;

public class SAX extends DefaultHandler  // 3
{
static String dateiName;    // 4
static String elementName;

//---- main ----
public static void main(String args[])  // 5
{
if (args.length != 2)     // 6
{
 System.err.println    // 7
   ("Aufruf: SaxBsp01 <dateiname> <element>");
 System.exit(1);
}
dateiName = args[0];    // 8
elementName = args[1];      
DefaultHandler handler = new SAX();  // 9
}

//---- constructor ----
public SAX()         // 10
{
SAXParserFactory factory =  // 11
 SAXParserFactory.newInstance();
factory.setNamespaceAware(true);  // 12
try                 // 13
{
 SAXParser saxParser =   // 14
   factory.newSAXParser();
 saxParser.parse     // 15
   ( new File(dateiName), this);

} catch (Throwable t) { // 16
 t.printStackTrace();    // 17
}
System.exit(0);       // 18
}

//----------------------------------------------
//Überschreibe Methoden des SAX DocumentHandler 
//----------------------------------------------
public void startDocument() // 19
throws SAXException
{
System.out.println("Dokumentanfang"); // 20
}

public void endDocument() 
throws SAXException
{
System.out.println("\nDokumentende");
}


public void startElement    // 21
(String namespaceURI,
String lName,           // 22
String qName, 
Attributes attrs)     // 23
throws SAXException
{
if (lName.equals(elementName))  // 24
{
 System.out.println("\nELEMENT: "+lName);
 for(int x=0; x<attrs.getLength(); x++)  // 25
 {
   String localName=   // 26
     attrs.getLocalName(x);
   System.out.print("  ATTR : ");  // 27
   System.out.println(localName);
   System.out.println
     ("         "+attrs.getValue(x));
 }
}
}
}






ich komme einfach nicht drauf, wie ich nun den inhalt / text ausgeben kann, also zb "erlenkötter" oder "helmut".


mit folgendem code kann man die attribute ausgeben, aber ich finde irgend wie nirgends eine möglichkeit obiges auszugeben.

dachte zuerst ich muss es mit der methode "characters" machen, aber bringe es nicht zu stande. auch in der APi schaffe ich es nicht, die lösung zu finden.

kann mir da jemand kurz weiterhelfen?
 

akira

Bekanntes Mitglied
Die characters-Methode ist schon richtig, Du must dann nur noch einen String draus machen.

Oder wo genau kommst Du nicht weiter?
 

megachucky

Bekanntes Mitglied
mir ist ehrlich gesagt nicht ganz klar, wie ich da jetzt nen string draus mache.
wie greife ich jetzt zb nur auf alle vornamen zu?
 

akira

Bekanntes Mitglied
Einen String kannst du daraus wie folgt machen:

Code:
public void characters(char[] ch, int start, int length) {
    String str = new String(ch,start,length);
}

Laß Dir den String einfach mal ausgeben und probiere ein bischen rum.
Im Prizip wird bei jedem Tag zuerst die startElement-Methode aufgerufen, dann charachters und zum Schluß endElement.
 

Bleiglanz

Gesperrter Benutzer
vorsicht:

ein einziges Element <foo>a b c </foo> kann mehrere character Events erzeugen (erst a, dann b, dann c)

man muss einen StringBuffer nehmen und die zusammenhängen
 

megachucky

Bekanntes Mitglied
Code:
public void startElement(String uri, String localName, String qName,
			Attributes attributes)
	{
		if (localName.equals("name"))
				{
			System.out.println("\nELEMENT: " + localName);
				}
	}
	
	public void characters(char ch[], int start, int length)
	{
		for (int i = start; i < (start + length); i++)
		{
			System.out.print(ch[i]);
		}
			
	}


hab es nun nochmal probiert, so wie oben. allerdings wird nicht nur der name ausgegeben, sondern eben alle daten, also vorname, nachname, isbn, seiten (falls vorhanden).

und wie beschränke ich es nun zb nur auf vorname ausgeben? da ist mir einfach nicht klar, was ich in der for schleife (ich nehme an man macht es trotzdem mit ner for-schleife) angeben soll ?!?
 

Bleiglanz

Gesperrter Benutzer
du musst dir den Kontext merken (so ist das eben bei SAX) und für jedes "Element" einen eigenen String bauen
 

akira

Bekanntes Mitglied
Ok, ich poste mal den Code einer vor längerer Zeit von mir geschriebenen Klasse zum Einlesen einer XML-Datei in einen Objektbaum, vielleicht hilfts Dir weiter:

Code:
public class XMLFileReader extends DefaultHandler {
	
	private XMLNode current;
	
	private XMLFileReader(XMLNode root) {
		current = root;
	}	
	
	/**
	* einlesen einer XML-Datei in einen Baum
	* @param file XML-Datei
	* @return root-Knoten des erzeugten Baumes
	*/
	public static XMLNode read(File file)
	throws IOException, ParserConfigurationException, SAXException {
		XMLNode root = new XMLNode();
		XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
		reader.setContentHandler(new XMLFileReader(root));
		reader.parse(new InputSource(new FileInputStream(file)));
		return root;
	}
	
	public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
		XMLNode node = new XMLNode(qName);
		if(atts.getLength()>0) {
			for(int i=0;i<atts.getLength();i++) node.addAttribute(atts.getQName(i), atts.getValue(i));
		}	
		current.addChild(node);
		current = node;
	}
	
	public void endElement(String namespaceURI, String localName, String qName) {
		current = current.getParent();	
	}
	
	public void characters(char[] ch, int start, int length) {
		boolean valid = false;
		for(int i=start;i<(start+length);i++) {
			if(!Character.isWhitespace(ch[i])) {
				valid = true;
				break;	
			}	
		} // wenn Zeichen außer Whitespaces vorkommen -> Wert setzen
		if(valid) current.setValue(new String(ch, start, length));
	}
}

Und hier die Knotenklasse:

Code:
public class XMLNode {
	
	private XMLNode parent;
	
	private String name;
	
	private Map attributes;
	
	private String value;
	
	private List children;
	
	/**
	* Konstruktor für root-Knoten
	*/
	XMLNode() {
		this("ROOT");
	}
	
	/**
	* Konstruktor für Unterknoten
	* @param name Name des Knotens
	*/
	XMLNode(String name) {
		this.name = name;
	}
	
	/**
	* Liefert den Eltern-Knoten
	* @return Eltern-Knoten
	*/
	public XMLNode getParent() {
		return parent;
	}
	
	/**
	* Testet, ob Knoten ein root ist
	* @return true, wenn root
	*/
	public boolean isRoot() {
		return parent==null;
	}
	
	/**
	* Liefert den Namen des Knotens
	* @return Name
	*/
	public String getName() {
		return name;
	}
	
	/**
	* Liefert den Wert (Inhalt) des Knotens
	* @return Wert
	*/
	public String getValue() {
		return value;
	}
	
	/**
	* liefert true, wenn der Wert des Knotens eins der folgenden Werte hat:
	* true, 1, yes, ja
	*/
	public boolean isTrue() {
		return "true".equals(value) ||
		       "1".equals(value) ||
		       "yes".equals(value) ||
		       "ja".equals(value);
	}
	
	
	/**
	* Liefert das Attribut mit dem übergebenen Namen
	* @return Wert des Attributes
	*/
	public String getAttribute(String name) {
		return attributes!=null?(String)attributes.get(name):null;
	}
	
	/**
	* Liefert true, wenn entsprechender Kindknoten vorh.
	*/
	public boolean hasNode(String name) {
		return getNode(name)!=null;
	}
	
	
	/**
	* liefert einen (den ersten, falls mehrere vorh.) Kind-Knoten
	* mit dem übergebenen Namen
	* @param name Namen des Knotens
	* @return Knoten
	*/
	public XMLNode getNode(String name) {
		XMLNode node = null;
		Iterator ic = children();
		while(ic.hasNext()) {
			XMLNode tmp = (XMLNode)ic.next();
			if(tmp.name.equals(name)) {
				node = tmp;
				break;	
			}	
		}
		return node;
	}
	
	/**
	* liefert eine Collection aller Kind-Knoten mit diesem Namen
	* @param name Name des Knotens
	* @return Collection aller Knoten dieses Namens
	*/
	public Collection getNodes(String name) {
		Collection col = new LinkedList();	
		Iterator ic = children();
		while(ic.hasNext()) {
			XMLNode tmp = (XMLNode)ic.next();
			if(tmp.name.equals(name)) col.add(tmp);
		}
		return col;
	}
	
	/**
	* Testet, ob Kind-Knoten vorhanden sind
	* @return true, wenn Kind-Knoten vorh.
	*/
	public boolean hasChildren() {
		return children!=null;
	}
	
	/**
	* Liefert alle Kind-Knoten (nicht rekursiv!)
	* @return Iterator über alle Kind-Knoten
	*/
	public Iterator children() {
		return hasChildren()?children.iterator():Collections.EMPTY_LIST.iterator();
	}
	
	
	void setValue(String value) {
		this.value = value;
	}
	
	void addAttribute(String key, String value) {
		if(attributes==null) attributes = new HashMap();
		attributes.put(key, value);	
	}
	
	void addChild(XMLNode child) {
		if(children==null) children = new LinkedList();
		child.parent = this;	
		children.add(child);
	} 
	
	/**
	* Liefert einen String-Repäsentation des Knotens einschliesslich aller Kind-Knoten
	* @return Baum als String
	*/
	public String toString() {
		return toString(this, 0);
	}
	
	private String toString(XMLNode node, int depth) {
		StringBuffer buf = new StringBuffer();
		for(int i=0;i<depth;i++) buf.append(" ");
		String tab = buf.toString();
		buf = new StringBuffer();
		buf.append(tab).append("[").append(node.name).append("]");
		if(node.value!=null) buf.append(" : ").append(node.value);
		buf.append("\n");
		if(node.attributes!=null) {
			Iterator ia = node.attributes.keySet().iterator();
			while(ia.hasNext()) {
				String key = (String)ia.next();
				buf.append(tab).append(" - ").append(key).append(" : ").append((String)node.attributes.get(key)).append("\n");	
			}
		}
		if(node.children!=null) {
			Iterator ic = node.children.iterator();
			while(ic.hasNext()) buf.append(toString((XMLNode)ic.next(), depth+4));	
		}
		return buf.toString();
	}
}
 

megachucky

Bekanntes Mitglied
hm, da der quellcode doch schon ziemlich groß ist, der gepostet wurde, ist es wohl sinnvoller für mein ziel gleich DOM zu benutzen als SAX, oder?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Daten eingeben und ausgeben mit einem Layout Java Basics - Anfänger-Themen 17
F Parabel Daten ausgeben Java Basics - Anfänger-Themen 18
R Alle Daten einer HashMap ausgeben Java Basics - Anfänger-Themen 17
J daten über jComboBox ausgeben wie? Java Basics - Anfänger-Themen 2
A Applet - Daten ausgeben - Fehler Java Basics - Anfänger-Themen 4
K Daten richtig ausgeben Java Basics - Anfänger-Themen 18
W RS232: Daten empfangen,bearbeiten,ausgeben Java Basics - Anfänger-Themen 2
D Daten im gui ausgeben Java Basics - Anfänger-Themen 9
S Durch TreeModel navigieren und Daten ausgeben Java Basics - Anfänger-Themen 2
N Daten auf Taskleiste ausgeben Java Basics - Anfänger-Themen 3
T Unvollständige Daten in der TableView Java Basics - Anfänger-Themen 8
S Daten aus Import Datei auslesen und sortieren Java Basics - Anfänger-Themen 2
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
Mady Daten von JList & Combobox in JTable adden Java Basics - Anfänger-Themen 2
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
W Daten in Echtzeit übernehmen Java Basics - Anfänger-Themen 5
Z Java ArrayList speichert falsche Daten ab bzw. gibt falsche Daten aus? Java Basics - Anfänger-Themen 42
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
E fehlermeldung bei richtigen login daten Java Basics - Anfänger-Themen 7
C Java Funktion: externe Daten vom Internet einbinden Java Basics - Anfänger-Themen 2
P Schiebefix - ArrayList überschreibt Daten Java Basics - Anfänger-Themen 3
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
M Tabellen- Daten laden Java Basics - Anfänger-Themen 2
A Klasse um daten zu einlesen Java Basics - Anfänger-Themen 26
A Literale für primitive Daten Typen Java Basics - Anfänger-Themen 4
N Zwei Daten (Datum) miteinander vergleichen, abspeichern, laden Java Basics - Anfänger-Themen 4
A Daten auslesen/vergleichen Java Basics - Anfänger-Themen 3
D Sportwetten Daten Atomatisch analysieren um optimale Strategie zu erhalten Java Basics - Anfänger-Themen 6
S Java Daten in Excel speichern Java Basics - Anfänger-Themen 1
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
L Daten aus ArrayList in Datenbank durchsuchen Java Basics - Anfänger-Themen 5
Shallty Daten speichern und ändern? Java Basics - Anfänger-Themen 32
M Sqlite table löschen und daten einfügen Java Basics - Anfänger-Themen 5
S Binäre-Suche bei unsortierten Daten Java Basics - Anfänger-Themen 7
N Was passiert wenn wir Daten auf der Festplatte abspeichern wollen? bzgl. BufferStreams Java Basics - Anfänger-Themen 9
T Daten von Objekten speichern Java Basics - Anfänger-Themen 7
A Minesweeper - Daten Java Basics - Anfänger-Themen 46
A Eingelesene Daten in Array(Liste) abspeichern? Java Basics - Anfänger-Themen 18
S Daten aus zwei Verschiedenen Tabellen in eine ArrayListe Java Basics - Anfänger-Themen 4
WPS1000 Input/Output Wie aktiviere ich den Daten Transfer von der RS232 in meine Java Applikation Java Basics - Anfänger-Themen 2
R Eigenes Protokoll zur Übermittlung von Daten zum Webserver? Java Basics - Anfänger-Themen 4
A Reader wohin werden Daten gespeichert? Java Basics - Anfänger-Themen 7
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
S Daten aus eigenständiger .class-Datei abrufen Java Basics - Anfänger-Themen 1
E Daten dem Super Aufruf übergeben Java Basics - Anfänger-Themen 3
M jTabel mit Daten Füllen Java Basics - Anfänger-Themen 5
M Wie erzeuge ich die Differenz von zwei Daten in Stunden?? Java Basics - Anfänger-Themen 2
S Daten lesen und speichern Java Basics - Anfänger-Themen 26
S JTable mit Daten füllen Java Basics - Anfänger-Themen 7
L Java Programm zum Auswerten von Daten Java Basics - Anfänger-Themen 11
H Passwortmanager, Sicherheit der Daten Java Basics - Anfänger-Themen 12
G Best Practice Wie große "Tabellen" effizient durchsuchen und Daten händeln? Java Basics - Anfänger-Themen 15
U Daten aus Datei einlesen Java Basics - Anfänger-Themen 4
M Best Practice Daten-Import /Trabsfomration aus Textdatei Java Basics - Anfänger-Themen 12
R JTable Suchfunktion mit SQL Daten Java Basics - Anfänger-Themen 2
E Daten gehen nicht in Datenbank Java Basics - Anfänger-Themen 14
M Erste Schritte Speichern von mehreren Daten Java Basics - Anfänger-Themen 3
J Daten einer Textdatei in ein JTable importieren. Java Basics - Anfänger-Themen 3
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Endlosschleife bei füllen von Daten im JTable Java Basics - Anfänger-Themen 5
N Erste Schritte Dedicated Server \ Senden und Empfangen von Daten/Befehlen Java Basics - Anfänger-Themen 2
A Probleme beim zykl. aktulisieren von Daten in JTable Java Basics - Anfänger-Themen 3
D NPE beim laden von Daten aus MySQL Java Basics - Anfänger-Themen 9
P Einlesen von Daten via BufferedReader Java Basics - Anfänger-Themen 4
P Methoden ausgelesene (CSV-) Daten in Liste einer anderen Klasse einlesen Java Basics - Anfänger-Themen 0
F Daten aus Excel-Tabelle in Java importieren Java Basics - Anfänger-Themen 15
F Http Post von mehreren Daten Java Basics - Anfänger-Themen 5
F Daten auf Webserver laden - wiederholen bei Fehler Java Basics - Anfänger-Themen 0
W Best Practice problemabhängige Persistentmachung von Daten Java Basics - Anfänger-Themen 6
P Daten von Internetseite auslesen Java Basics - Anfänger-Themen 10
N Daten/Formular per POST an Firefox/Browser senden Java Basics - Anfänger-Themen 7
D Daten mit Apache POI in eine Excel Datei schreiben Java Basics - Anfänger-Themen 5
T JTable Daten aus txt datei Java Basics - Anfänger-Themen 3
T printf Daten aus der Tabelle in Excel übernehmen Java Basics - Anfänger-Themen 5
P zweidimensionales Array anlegen und mit DB-Daten füllen Java Basics - Anfänger-Themen 14
V Einlesen von Daten Java Basics - Anfänger-Themen 8
J TableView zeigt keine Daten an Java Basics - Anfänger-Themen 14
J Daten im Programm speichern Java Basics - Anfänger-Themen 14
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
O Probleme mit CSV Daten Java Basics - Anfänger-Themen 10
M Arrays: Trennung von Daten und Darstellung Java Basics - Anfänger-Themen 1
S Daten aus Array in Klasse übertragen Java Basics - Anfänger-Themen 12
M Wie sicher sind Daten im Java Programm? Java Basics - Anfänger-Themen 9
R Daten via Post an php Script senden Java Basics - Anfänger-Themen 1
B Probleme bei "Daten in CSV File schreiben". Java Basics - Anfänger-Themen 9
C Datei mit Daten einlesen und höchsten wert der zweiten Spalte ermitteln Java Basics - Anfänger-Themen 1
W (XML/XSL) Daten aus Eclipse in eine Klasse Laden. Java Basics - Anfänger-Themen 1
I Daten speichern ohne Datenbank Java Basics - Anfänger-Themen 20
D Daten von einem int in einen string Java Basics - Anfänger-Themen 5
L Daten aus Array Feld löschen Java Basics - Anfänger-Themen 2
T Input/Output Daten/Objekte einfach speichern Java Basics - Anfänger-Themen 5
IngoF GUI mit Thread Daten austauschen. Java Basics - Anfänger-Themen 6
S Daten aus anderen Dateien in neue Datei einlesen Java Basics - Anfänger-Themen 3
fLooojava Daten im selben Netzwerk an IP Java Basics - Anfänger-Themen 1
M Junit Tests durchführen, die eine Verbindung zu einer Daten erfordern Java Basics - Anfänger-Themen 3
K HashMap mit Daten aus ArrayList befüllen Java Basics - Anfänger-Themen 14

Ähnliche Java Themen


Oben