XML mit Saxparser, Probleme bei Struktur

Saarlodri

Grünschnabel
XML Datei Parsen, Probleme bei anderer Struktur

Hallo!

Ich habe folgendes Programm:

Code:
import java.util.List;
import java.util.Iterator;

import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;

public class Saxparser
{
	
		public static void main(String[] args)
		{
					  SAXBuilder sxbuild = new SAXBuilder();
					  InputSource is = new InputSource("adressen.xml");
					  try
					  {		
						  Document doc = sxbuild.build(is);
						  Element root = doc.getRootElement();
			
						  List list = root.getChildren("adresse");
						  Iterator iterator = list.iterator();

						  while(iterator.hasNext())
						  {
				
							  Element element = (Element)iterator.next();
				
								String sName 					= element.getChild("name").getAttributeValue("nachname");
								String sVorname  			= element.getChild("name").getAttributeValue("vorname");
								String sStrasse 			= element.getChild("strasse").getText();
								String sHausnummer 		= element.getChild("hausnummer").getText();
								String sPostleitzahl 	= element.getChild("postleitzahl").getText();
							  	String sWohnort				= element.getChild("wohnort").getText();

										
										
										
							System.out.println(sWohnort);
							System.out.println(sVorname);
							System.out.println(sStrasse);
							System.out.println(sHausnummer);
							System.out.println(sPostleitzahl);
							System.out.println(sWohnort+"\n\n");
						  }
					  }
					  catch(Exception e){}
		
		}
}

Die XML Datei sieht folgendermaßen aus:

Code:
<?xml version="1.0"?>

<adresses>
   <adresse>
      <name>Mustermann</name>
      <vorname>Hans</vorname>
      <strasse>Musterstrasse</strasse>
      <hausnummer>471</hausnummer>
      <postleitzahl>12345</postleitzahl>
      <wohnort>Berlin</wohnort>
   </adresse>
   <adresse>
      <name>Mustermann</name>
      <vorname>Kurt</vorname>
      <strasse>Kaiserstrasse</strasse>
      <hausnummer>4</hausnummer>
      <postleitzahl>98765</postleitzahl>
      <wohnort>Kleinkleckersdorf</wohnort>
   </adresse>
   <adresse>
      <name>Tunichtgut</name>
      <vorname>Elfriede</vorname>
      <strasse>Bahnhofstrasse</strasse>
      <hausnummer>1</hausnummer>
      <postleitzahl>55555</postleitzahl>
      <wohnort>Hogsmeade</wohnort>
   </adresse>
   <adresse>
      <name>Dumbledore</name>
      <vorname>Albus</vorname>
      <strasse>Hexenstrasse</strasse>
      <hausnummer>666</hausnummer>
      <postleitzahl>66666</postleitzahl>
      <wohnort>Hogwarts</wohnort>
   </adresse>
</adresses>

Dieses Programm läuft auch, ich möchte aber mit dem Programm folgende XML Datei ausgeben:

Code:
- <szenario>
  <szenname>XYZ</szenname> 
  <szentype>A</szentype> 
  <szeninst>123</szeninst> 
  <szenversion>5</szenversion> 
- <komponenten>
- <komponente>
  <name>Karl Heinz</name> 
  <beschreibung>M</beschreibung> 
  <host>www.karl.de</host> 
  <wert>unknown</wert> 
- <nachricht>
  <status>ok</status> 
  <wert>0</wert> 
  <text>online</text> 
  </nachricht>
  </komponente>
- <komponente>
  <name>Dieter</name> 
  <beschreibung>M</beschreibung> 
  <host>www.agsg.de</host> 
  <wert>unknown</wert> 
- <nachricht>
  <status>ok</status> 
  <wert>2</wert> 
  <text>offline</text> 
  </nachricht>
  </komponente>
</komponenten>
</szenario>

Und da diese XML Datei eine andere Struktur hat weiß ich nicht wie ich mein Programm jetzt anpasse damit es den Inhalt (<name>, <beschreibung>, <host>, <wert>, <status>,<wert> & <text> sollen ausgegeben werden) der XML-Datei ausgibt.

Kann mir da bitte jemand weiterhelfen?

Gruß Saar
 
Zuletzt bearbeitet:
Hallo!

Ich verwende dazu immer XPath Ausdrücke...

Schau mal hier:
Code:
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XMLTest {

	public static void main(String[] args) {
		try {
			Document doc =
				DocumentBuilderFactory
					.newInstance()
					.newDocumentBuilder()
					.parse(
					XMLTest.class.getResourceAsStream("./test.xml"));

			Node node = XPathAPI.selectSingleNode(doc, "//szenname/text()");
			System.out.println(node.getNodeValue());

			node = XPathAPI.selectSingleNode(doc, "//szentype/text()");
			System.out.println(node.getNodeValue());

			node = XPathAPI.selectSingleNode(doc, "//szeninst/text()");
			System.out.println(node.getNodeValue());

			node = XPathAPI.selectSingleNode(doc, "//szenversion/text()");
			System.out.println(node.getNodeValue());

			NodeList nodes = XPathAPI.selectNodeList(doc, "//komponenten/*");

			int len = nodes.getLength();
			for (int i = 0; i < len; i++) {
				Node nodeRoot = nodes.item(i);

				node =
					XPathAPI.selectSingleNode(
						nodeRoot,
						"//komponente[" + (i + 1) + "]/name/text()");
				System.out.println(node.getNodeValue());

				node =
					XPathAPI.selectSingleNode(
						nodeRoot,
						"//komponente[" + (i + 1) + "]/beschreibung/text()");
				System.out.println(node.getNodeValue());

				node =
					XPathAPI.selectSingleNode(
						nodeRoot,
						"//komponente[" + (i + 1) + "]/host/text()");
				System.out.println(node.getNodeValue());

				node =
					XPathAPI.selectSingleNode(
						nodeRoot,
						"//komponente[" + (i + 1) + "]/wert/text()");
				System.out.println(node.getNodeValue());

				node =
					XPathAPI.selectSingleNode(
						nodeRoot,
						"//komponente["
							+ (i + 1)
							+ "]/nachricht/status/text()");
				System.out.println(node.getNodeValue());

				node =
					XPathAPI.selectSingleNode(
						nodeRoot,
						"//komponente[" + (i + 1) + "]/nachricht/wert/text()");
				System.out.println(node.getNodeValue());

				node =
					XPathAPI.selectSingleNode(
						nodeRoot,
						"//komponente[" + (i + 1) + "]/nachricht/text/text()");
				System.out.println(node.getNodeValue());

			}

		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (FactoryConfigurationError e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}

	}
}

Mein Testfile:
Code:
<szenario>
   <szenname>XYZ</szenname> 
   <szentype>A</szentype> 
   <szeninst>123</szeninst> 
   <szenversion>5</szenversion> 
   <komponenten>
      <komponente>
         <name>Karl Heinz</name> 
         <beschreibung>M</beschreibung> 
         <host>www.karl.de</host> 
         <wert>unknown</wert> 
         <nachricht>
            <status>ok</status> 
            <wert>0</wert> 
            <text>online</text> 
         </nachricht>
      </komponente>
      <komponente>
         <name>Dieter</name> 
         <beschreibung>M</beschreibung> 
         <host>www.agsg.de</host> 
         <wert>unknown</wert> 
         <nachricht>
            <status>ok</status> 
            <wert>2</wert> 
            <text>offline</text> 
         </nachricht>
      </komponente>
   </komponenten>
</szenario>

...und hier die Ausgabe:
Code:
XYZ
A
123
5
Karl Heinz
M
www.karl.de
unknown
ok
0
online
Dieter
M
www.agsg.de
unknown
ok
2
offline

HTH
Gruß Tom
 
Zurück