# SAX-Parser - Dokumente einlesen und in einer Map ablegen



## bvdcomp (1. Jun 2011)

Hallo zusammen

Ich habe eine Propertylist in XML mit dazugehörigem DTD und soll diese mittels SAX-parser einlesen und in einer Map speichern.

XML -> config.xml
[XML]
<?xml version="1.0+ encoding="UTF-8"?>
<!DOCTYPE RootElement SYSTEM "Y:\.......\XML\dtd\RootElement.dtd">
<Liste>
	<Eigenschaft>
		<Schluessel>IP-Adresse</Schluessel>
		<Wert>192.168.1.100</Wert>
		<Schluessel>DHCP</Schluessel>
		<Wert>255.255.255.0</Wert>

		<Schluessel>DNS</Schluessel><Wert>62.2.17.20</Wert>
		<Schluessel>DNS 2</Schluessel>
		<Wert>62.20.17.2</Wert>
		<Schluessel>Gateway</Schluessel>
		<Wert>192.168.1.1</Wert>
	</Eigenschaft>
</Liste>
[/XML]

DTD - RootElement.dtd

```
<!Element Liste (Eigenschaft)*>
<!Element Eigenschaft (Schluessel, Wert)>
<Element Schluessel (#PCDATA)>
<Element Wert(#PCDATA)>
```

JAVA -> SaxTest.java

```
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.xml.sax.helpers.DefaultHandler;
import java.io.*;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

public class SaxTest{
	protected static final String XML_FILE_NAME ="config.xml";
	public static void main(String[] args){
	// liefert eine SAXParserFactory
	SAXParserFactory factory = SAXParserFactory.newInstance();
	try {
		// Die Methode newSAXParser() liefert einen SAXParser
		SAXParser saxParser = factory.newSAXParser();
		
		DefaultHandler handler= new MyHandler();
		saxParser.parse(XML_FILE_NAME, handler);
		}
	catch (ParserConfigurationException e){
		e.printStackTrace();
		}
	catch (SAXException e){
		e.printStackTrace();
		}
	catch (IOException e){
		System.out.println("I/O-Problem " + e);
		}
	}
}

class MyHandler extends DefaultHandler{
	// Event handlers
	Map<String,String> mp=new HashMap<String, String>();
	/**
	 * Wird aufgerufen, wenn der Parser den Dokumentanfang findet
	 */
		public void startDocument(){
		System.out.println("Start document");
	}
	
	/**
	 *  Wird aufgerufen, wenn der Parer das Dokumentende findet
	 */
	public void endDocument(){
		System.out.println("End document");
	}
	
	/** 
	 * Wird aufgerufen, wenn ein Start-Tag gefunden wird. 
	 * Parameter sind alle Datendes Start-Tags: Namensraum-URI, likaler Name
	 * qualifizierter name, Attribute  
	 */
	public void startElement(String uri, String name, String qname, Attributes atts)
	{
		mp.put(schluessel, atts);
	}
	
	/**
	 * Wird aufgerufen, wenn ein Ende-Tag gefunden wird -> Ausgabe vom Map-Inhalt
	 */
	public void endElement(String uri, String name, String qName)
	{
        Set s=mp.entrySet();
        Iterator it=s.iterator();

        while(it.hasNext())
        {
            Map.Entry m =(Map.Entry)it.next();
            int key=(Integer)m.getKey();
            String value=(String)m.getValue();
            System.out.println("Key :"+key+"  Value :"+value);
        }
	}
}
```

Ich habe das Problem das ich es nicht einlesen kann!
Kann mir da jemand weiterhelfen?

Danke:rtfm:


----------



## Noctarius (1. Jun 2011)

Ich finde das XML Schema extrem ungünstig. Was mache ich denn wenn ich 2x Schluessel oder 2x Wert hintereinander habe, was ja durchaus gültig wäre. Wie willst du die dann zuordnen?

Besser wäre etwas wie:
[xml]<?xml version="1.0+ encoding="UTF-8"?>
<!DOCTYPE RootElement SYSTEM "Y:\.......\XML\dtd\RootElement.dtd">
<Liste>
    <Eigenschaft>
        <Eintrag schluessel="IP-Adresse">192.168.1.100</Eintrag>
        <Eintrag schluessel="DHCP">255.255.255.0</Schluessel>
    </Eigenschaft>
</Liste>[/xml]


----------



## bvdcomp (1. Jun 2011)

Hallo Noctarius

Ok, sehe ich jetzt auch, wo Du es erwähnst.

Die Methode startElement in der Klasse MyHandler


```
public void startElement(String uri, String name, String qname, Attributes atts)
    {
        mp.put(schluessel, atts);
    }
```

Ich komm da nicht weiter wie ich die Werte in einer Map anlegen kann.
Wer kann helfen?:rtfm:


----------

