# Current state START_ELEMENT is not among the states....



## ForenDaddy (23. Mrz 2011)

hi,
ich versuche gerade einen stax parser sinnvoll einzuseten, stolpere aber über ein problem, dass ich mir nicht so recht erklären kann.

folgender code funktioniert:

```
public class Parser {

    static File readXML = new File( "C:\\test.xml" );
    static String text = null;

    public static void main( String[] args ) throws XMLStreamException {
      
      XMLInputFactory inputFactory = XMLInputFactory.newInstance();
      XMLStreamReader stax = inputFactory.createXMLStreamReader( new StreamSource (readXML) );
      
      while( stax.hasNext() ) {
         stax.next();

            if ( stax.hasText() ) {
                 text = stax.getText();
                System.out.print( text + "test\n");
            }
      }
   }
}
```
dabei gibt er mir immer den text aus, der zwischen den tags des xml files liegt.
soweit so gut.
jetzt möchte ich, dass er mir nur den text ausgiebt, der zwischen bestimmten tags liegt.

```
public class Parser2 {
    static File readXML = new File( "C:\\test.xml" );
    static String text = null;
    static String name = null;

    public static void main( String[] args ) throws XMLStreamException {

      XMLInputFactory inputFactory = XMLInputFactory.newInstance();
      XMLStreamReader stax = inputFactory.createXMLStreamReader( new StreamSource (readXML) );

      while( stax.hasNext() ) {
        System.out.println( "Event: " + stax.getEventType() );

        switch ( stax.getEventType() ) {
            case XMLStreamConstants.START_ELEMENT:
                name = stax.getName().getLocalPart();
                System.out.println( name );
                if ( name.equals("fnr") ) {
                     text = stax.getText();
                     System.out.print( name + " Fahrzeugnummer: " + text + "\n");
                }
                break;
        }
        stax.next();
      }
   }
}
```
hier kriege ich die Fehlermeldung:
Exception in thread "main" java.lang.IllegalStateException: Current state START_ELEMENT is not among the statesCHARACTERS, COMMENT, CDATA, SPACE, ENTITY_REFERENCE, DTD valid for getText() 
        at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.getText(XMLStreamReaderImpl.java:1061)
        at Parser2.main(Parser2.java:39)
Java Result: 1

die frage ist, warum bekomme, ich bei zeile 18 im 2. beispiel einen fehler, im 1. beispiel bei zeile 15 aber nicht?
sie unterscheiden sich doch gar nicht.


----------



## AmunRa (23. Mrz 2011)

Doch sie unterscheiden sich schon.

Im ersten Beispiel fragst du vorher ab ob das stax element einen Text hat. und nur dann kannst du stax.getText() fehlerfrei aufrufen.

ein XML elemetn sieht so aus

<name>TEXT</name>
mit der case abfrage XMLStreamConstants.START_ELEMENT:

bist dugrade bei dem Tel <name> zu diesem Zeipunkt kannst du aber getText nicht aufrufen, da es ja gar keinen Text gibt.
erst wenn du z.B. im Sate XMLStreamConstants.CHARACTERS bist kannst du die getText() aufrufen.


----------



## ForenDaddy (23. Mrz 2011)

achsoooooooooooooooooooooooooooooooooooooo
ich dachte der parser geht zum nächsten tag mit stax.next().
der tag hat ja aus meiner sicht einen namen und einen text. z.B. <fnr>1234</fnr>
also habe ich sozusagen ein objekt fnr, dass aus dem namen = fnr und dem text = 1234 besteht.
das war zumindest mein gedanke.
aber er trennt wirklich jedesmal ab.
wenn er einen tag findet ist das ein "element", der nachfolgende text ist ein "element", abschließende tag ist auch "element.
und da muss ich jedesmal stax.next() sagen, damit ich von element zu element komme.
seh ich das richtig?

ich habe das jetzt so gemacht:

```
if ( name.equals("fnr") ) {
                    stax.next();
                    text = stax.getText();
                    System.out.print( name + " Fahrzeugnummer: " + text + "\n");
                }
```
ich habe nur die zeile 2 hinzugefügt.
damit er, wenn er ein entsprechendes tag findet, dann zum nächsten element hüpft, dem eigentlich gewünschten text.


----------



## AmunRa (23. Mrz 2011)

Wenn das bei dir so funktioniert kannst du das natürlich verwednen.

wenn aber eine XMl datei kommt bei der auch so etwas zulässig ist hast du natürlich ein Problem.
<fnr>TEXT</fnr>
<fnr/>
<fnr>TEXT2</fnr>

daher kann ich dir da eingentlich nicht wirklich etwas raten.


----------



## ForenDaddy (23. Mrz 2011)

ich wollte ja erst einmal gezielt überhaupt etwas auslesen können.
das geht jetzt.
wenn man mehrer einträge hat, dann muss ich das eben abfangen.
aber als testanwendung reicht das erst einmal.


----------

