# XML-Daten fehlen in der Darstellung



## Oensel (17. Okt 2005)

Ich muss dringend folgende XMl-Datei auslesen, bekomme aber nur einen Teil des Inhalts angezeigt.


```
<?xml version="1.0" encoding="UTF-8"?>
<SysWatch xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="syswatch.xsd">
	<Bedienernachrichten>
		<WorkstationID>R52343T21</WorkstationID>
		<Institutsnummer>WL-2353</Institutsnummer>
		<Timestamp>2147483647</Timestamp>
		<lfdNummer>0</lfdNummer>
		<Bedienernachricht Typ="G" Serviceflag="*" Nachricht="GAA ANTWORTET NICHT"/>
	</Bedienernachrichten>
	<Bedienernachrichten>
		<WorkstationID>R52343T22</WorkstationID>
		<Institutsnummer>WL-2353</Institutsnummer>
		<Timestamp>2147483649</Timestamp>
		<lfdNummer>1</lfdNummer>
		<Bedienernachricht Typ="S" Serviceflag="*" Nachricht="SBT ANTWORTET NICHT"/>
	</Bedienernachrichten>
	<Bedienernachrichten>
		<WorkstationID>R52343T23</WorkstationID>
		<Institutsnummer>WL-2353</Institutsnummer>
		<Timestamp>2147483652</Timestamp>
		<lfdNummer>2</lfdNummer>
		<Bedienernachricht Typ="K" Serviceflag="*" Nachricht="KAD ANTWORTET NICHT"/>
	</Bedienernachrichten>
</SysWatch>
```

Dazu habe ich folgendes Java-Programm gebastelt:


```
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;

public class Test_IKSBS extends DefaultHandler {

    public static void main(String[] arguments) {
        if (arguments.length == 0) {
        	Test_IKSBS read = new Test_IKSBS();
        } 
    }

    Test_IKSBS() {
        File input = new File("E:/XML/Bedienernachrichten.xml");
        SAXParserFactory factory = SAXParserFactory.newInstance();
        factory.setValidating(true);
        try {
            SAXParser sax = factory.newSAXParser();
            sax.parse(input, new LibraryHandler() );
        } catch (ParserConfigurationException pce) {
            System.out.println("Could not create that parser.");
            System.out.println(pce.getMessage());
        } catch (SAXException se) {
            System.out.println("Problem with the SAX parser.");
            System.out.println(se.getMessage());
        } catch (IOException ioe) {
            System.out.println("Error reading file.");
            System.out.println(ioe.getMessage());
        }
        
    }
}

class LibraryHandler extends DefaultHandler {
    static int READING_WorkstationID = 1;
    static int READING_Institutsnummer = 2;
    static int READING_Timestamp = 3;
    static int READING_Bedienernachricht = 4;
    static int READING_NOTHING = 0;
    int currentActivity = READING_NOTHING;
    Bedienernachrichten Nachricht = new Bedienernachrichten();

    LibraryHandler() {
        super();
    }

    public void startElement(String uri, String localName,
        String qName, Attributes attributes) {
    
        if (qName.equals("WorkstationID"))
            currentActivity = READING_WorkstationID;
        else if (qName.equals("Institutsnummer"))
            currentActivity = READING_Institutsnummer;
        else if (qName.equals("Timestamp"))
            currentActivity = READING_Timestamp;
        else if (qName.equals("Bedienernachricht"))
            currentActivity = READING_Bedienernachricht;
        if (currentActivity == READING_Bedienernachricht) {
            Nachricht.Typ = attributes.getValue("Typ");
            Nachricht.Serviceflag = attributes.getValue("Serviceflag");
            Nachricht.Nachricht = attributes.getValue("Nachricht");
        }
    }

    public void characters(char[] ch, int start, int length) {
        String value = new String(ch, start, length);
        if (currentActivity == READING_WorkstationID)
            Nachricht.WorkstationID = value;
        if (currentActivity == READING_Institutsnummer)
            Nachricht.Institutsnummer = value;
        if (currentActivity == READING_Timestamp)
            Nachricht.Timestamp = value;
        if (currentActivity == READING_Bedienernachricht)
            Nachricht.Bedienernachricht = value;

   }

   public void endElement(String uri, String localName, String qName) {
       if (qName.equals("Bedienernachrichten")) {
           System.out.println("\nWorkstation: " + Nachricht.WorkstationID);
           System.out.println("Institut: " + Nachricht.Institutsnummer);
           System.out.println("Timestamp: " + Nachricht.Timestamp);
           System.out.println("Typ: " + Nachricht.Typ);
           System.out.println("Serviceflag: " + Nachricht.Serviceflag);
           System.out.println("Nachricht: " + Nachricht.Nachricht);
           Nachricht = new Bedienernachrichten();
       }
    }                    
}

class Bedienernachrichten {
    String WorkstationID;
    String Institutsnummer;
    String Timestamp;
    String Bedienernachricht;
    String Typ;
    String Serviceflag;
    String Nachricht;
}
```

und der Output ist zur Zeit folgender:
Workstation: 		
Institut: 		
Timestamp: 		
Typ: G
Serviceflag: *
Nachricht: GAA ANTWORTET NICHT

Workstation: 		
Institut: 		
Timestamp: 		
Typ: S
Serviceflag: *
Nachricht: SBT ANTWORTET NICHT

Workstation: 		
Institut: 		
Timestamp: 		
Typ: K
Serviceflag: *
Nachricht: KAD ANTWORTET NICHT


Am besten wäre es, wenn ihr die Code-Änderungen direkt hier eintragt, denn ich bin noch neu in Java und dann habe ich von für mich nicht eindeutigen Aussagen nicht viel. Einen XML-Dialekt kann ich hier aber aufgrund des feststehenden XML-Formates nicht anwenden (denke ich), da ich keine Änderungen an der XML vornehmen darf.


----------



## Beni (17. Okt 2005)

Die Methode "characters" wird manchmal mehr als einmal aufgerufen, mach doch mal ein println in der Methode und gib die Strings aus (ob sie sinnvoll sind, ob sie überhaupt da sind, und welches Element an der Reihe ist).


----------



## Bleiglanz (17. Okt 2005)

nimm nicht den qName, sondern den localName wenn du in der startElement den "Kontext" umschaltest...

dein Doc hat ja einen Namespace


----------

