# XML-File auslesen, alles leer?



## Alerion (30. Jul 2006)

Hallo,

Ich versuche mit DOM eine XML-Datei auszulesen und diese dann erstmal in einem Textfenster anzuzeigen. Aus irgendeinem Grund mag das aber nicht so, wie ich, das Fenster bleibt nämlich leer. Kann sich jemand den Code mal ankucken und mir sagen, wo der Fehler liegt?

Mein Java Code:


```
import java.io.*;
import java.awt.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.awt.event.*;
import javax.swing.*;

public class JDOMParse 
{
	static Document document;
	JDOMParseFenster fenster=new JDOMParseFenster(800,500,100,100,"JDOMParse");
	JDOMParseFenster ErrorFenster=new JDOMParseFenster(500,2000,100,600,"JDOMParse Fehlermeldung");
	

	/**
	 * @param args
	 */
	public static void main(String args[]) {		
		try
		{
			String LookAndFeel=UIManager.getSystemLookAndFeelClassName();
			UIManager.setLookAndFeel(LookAndFeel);
		}
		
		catch (Exception e)
		{
			System.out.println("Fehler " + e);
		}
		
		String param = new String("C:\\Dokumente und Einstellungen\\Alerion\\Eigene Dateien\\Eigene Dokumente\\Artikelliste.xml");
		
		JDOMParse jdomparser = new JDOMParse(param);

	}
	
	public JDOMParse(String param)
	{
		parsing(param);
	}

	public void parsing(String param)
	{
		File datei=new File(param);
		boolean laden=datei.canRead();
		if (laden == true)
		{
			try
			{
				DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
				DocumentBuilder builder = factory.newDocumentBuilder();
				document = builder.parse(datei);
			}
			
			catch (SAXParseException error)
			{
				ErrorFenster.ausgabe("\n+++Parse Error++++" + "\nZeile: " + error.getLineNumber() + "\nDatei: " + error.getSystemId());
				ErrorFenster.ausgabe("\n" + error.getMessage());
			}
			
			catch (ParserConfigurationException pce)
			{
				pce.printStackTrace ();
			}
			
			catch (IOException ioe)
			{
				ioe.printStackTrace();
			}
			
			catch (Throwable t)
			{
				t.printStackTrace();
			}
		}
		
		else
		{
			ErrorFenster.ausgabe("Datei existiert nicht!");
		}
		
		auswertung();
	}
	
	public void auswertung()
	{
		int a, anz_untertags, b;
		NodeList tagliste=document.getElementsByTagName("Artikelliste");
		NodeList ChildTags;
		int anz=tagliste.getLength();
		Node das_tag;
		String inhalt="";
		short TagTyp;
		System.out.println("Anzahl" + anz);
		for (a=0;a<anz; a++)
		{
			ChildTags=tagliste.item(a).getChildNodes();
			anz_untertags=ChildTags.getLength();
			System.out.println("Anzahl Untertags" + anz_untertags);
			for(b=0; b<anz_untertags; b++)
			{
				das_tag=ChildTags.item(b);
				TagTyp=das_tag.getNodeType();
				if (TagTyp==Node.ELEMENT_NODE)
				{
					System.out.println("Inhalt" + das_tag.getFirstChild());
					inhalt=inhalt + das_tag.getFirstChild().getNodeValue() +"\t\t";
				}
			}
			fenster.ausgabe(inhalt);
			inhalt="\n";
		}
	}
}

class JDOMParseFenster extends JFrame implements WindowListener
{
	JTextArea textbereich;
	public JDOMParseFenster(int breite, int hoehe, int posx, int posy, String name)
	{
		setSize (breite, hoehe);
		setLocation (posx, posy);
		setTitle (name);
		textbereich=new JTextArea();
		Container content = getContentPane();
		content.add(textbereich);
		addWindowListener(this);
		show();
	}
	
	public void ausgabe(String s)
	{
		textbereich.append(s);
	}
	
	public void windowClosing(WindowEvent evt)
	{
		dispose();
		System.exit(0);
	}
	public void windowOpened(WindowEvent evt){}
	public void windowIconified(WindowEvent evt){}
	public void windowDeiconified(WindowEvent evt){}
	public void windowClosed(WindowEvent evt){}
	public void windowActivated(WindowEvent evt){}
	public void windowDeactivated(WindowEvent evt){}
}
```

Die XML-Datei:


```
<?xml version="1.0" encoding="ISO-8859-1"?>
<Artikelliste>
  <Artikel>
    <Name>Kartoffeln</Name>
    <Kategory>Gemüse</Kategory>
    <Einheit>kg</Einheit>
    <Menge>2</Menge>
    <PPE>2,99</PPE>
    <gekauft>1</gekauft>
  </Artikel>
  <Artikel>
    <Name>Milchn</Name>
    <Kategory>Milchprodukt</Kategory>
    <Einheit>l</Einheit>
    <Menge>2</Menge>
    <PPE>0,99</PPE>
    <gekauft>1</gekauft>
  </Artikel>
  <Artikel>
    <Name>Leberwurst</Name>
    <Kategory>Wurst</Kategory>
    <Einheit>g</Einheit>
    <Menge>500</Menge>
    <PPE>2,99</PPE>
    <gekauft>1</gekauft>
  </Artikel>
  <Artikel>
    <Name>Bier</Name>
    <Kategory>Getränke</Kategory>
    <Einheit>Kasten</Einheit>
    <Menge>1</Menge>
    <PPE>13,99</PPE>
    <gekauft>1</gekauft>
  </Artikel>
  <Artikel>
    <Name>Erbsen</Name>
    <Kategory>Gemüse</Kategory>
    <Einheit>Glas</Einheit>
    <Menge>1</Menge>
    <PPE>2,99</PPE>
    <gekauft>1</gekauft>
  </Artikel>
</Artikelliste>
```


----------



## foobar (30. Jul 2006)

Hast du mal getraced?

Ich vermute, daß du nicht über die Element sondern über irgendwelche Textknoten iterierst. Du kannst das auch viel einfacher lösen indem du immer mit getElementsByTagName arbeitest. Ungefähr so:


```
NodeList tagliste=document.getElementsByTagName("Artikel");

for (int i =0; i < tagliste.getNodeCount(); i++)
{
   Element elemArticle = (Element)tagliste.getNode(i);
   // jetzt kannst du auf elemArticle wieder ein getElementsByTagName machen und hast keine Probleme mit Textknoten
}
```

P.S. Es ist viel einfacher direkt nach Artikel zu suchen, weil Artikelliste das Root-Element ist und sowieso nur einmal vorkommen kann, ansonsten meckert der Parser schon beim Einlesen.


----------



## Alerion (30. Jul 2006)

Ich hab den Fehler gefunden. Ich hätte da gleich "Artikel" reinschreiben sollen. Jetzt funktioniert's. Danke.


----------

