# stax problem



## kermitblue (14. Okt 2006)

hallo,

hab folgendes problem mit stax (verwende im die sun implementation des staxparsers): 

ich versuche aus einem xml file (hier eine teilstruktur) 


```
<Entrezgene_type value="protein-coding">6</Entrezgene_type>
    <Entrezgene_source>
      <BioSource>
        <BioSource_org>
          <Org-ref>
            <Org-ref_taxname>Caenorhabditis elegans</Org-ref_taxname>
            <Org-ref_db>
              <Dbtag>
                <Dbtag_db>taxon</Dbtag_db>
                <Dbtag_tag>
                  <Object-id>
                    <Object-id_id>6239</Object-id_id>
                  </Object-id>
...
```

den textknoten mit dem wert 6 des knotens <Entrezgene_type> zu lesen. normalerweise sollte das ja mit XMLStreamreader.getElementText() funktionieren, tut es aber nicht bzw nur so das es einen unangenehmen nebeneffekt hat...

die implementation schaut folgendermassen aus:


```
private XMLStreamReader xmlr;
	int eventType;
	public void run()
	{
		XMLInputFactory xmlif = null ;
		try{
			xmlif = XMLInputFactory.newInstance();
			xmlif.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES,Boolean.TRUE);
			xmlif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES,Boolean.FALSE);         
			xmlif.setProperty(XMLInputFactory.IS_COALESCING , Boolean.TRUE);
		}catch(Exception ex){
			ex.printStackTrace();
		}
		long starttime = System.currentTimeMillis();
		try{                                              
			xmlr = xmlif.createXMLStreamReader("Data/testdata2.xml", new FileInputStream("Data/testdata3.xml"));
			eventType = xmlr.getEventType();
			int o;
			String sqlString = "";
			while(xmlr.hasNext()){
				eventType = xmlr.next();                   
				switch(eventType)
				{		
					case XMLStreamConstants.START_ELEMENT:
						if(xmlr.getLocalName().equals("Entrezgene_type"))
						{
							System.out.println(xmlr.getAttributeValue(0));
							System.out.println(xmlr.getElementText());
						}
						break;
					case XMLStreamConstants.END_ELEMENT:
						if(xmlr.getLocalName().equals("Entrezgene_type"))
						{
							System.err.println("Entrezgene_type closetag");
						}
						break;
				}
			}
		} 
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
```

das problem ist nun das - sobald die zeile 
	
	
	
	





```
System.out.println(xmlr.getElementText());
```
 aufgerufen wird, der endknoten von <Entrezgene_type> nicht mehr erkannt wird (was fuer meine applikation aber unbedingt noetig ist)... sobald ich die zeile rausnehme, laeuft alles wieder wunderbar... und falls ich versuche xmlr.getElementText() for xmlr.getAttributeValue(0) aufzurufen, gibt es folgende fehlermeldung:


```
java.lang.IllegalStateException: Current state is not among the states START_ELEMENT , ATTRIBUTEvalid for getAttributeValue()
	at com.sun.xml.stream.XMLReaderImpl.getAttributeValue(XMLReaderImpl.java:731)
```

obwohl ich ja klar in einem START_ELEMENT bin und diesen noch nicht verlassen habe... das ist echt zum haare raufen 
 

jemand hier der mir helfen kann?

lg kermitblue


----------



## Guest (15. Okt 2006)

Hi,

Ich habe keine Ahnung von Stax, aber ist sichergestellt das getElementText existiert und nicht igernd was doofes auslöst wenn es nicht da ist. Eigentlich sollte es doch dafür auch 'ne  Eventkonstante geben so wie bei SAX (da isses ne Methode) denn der Text müß ja evt. wegen der Entities vielleicht aus meheren Blöcken zusammen gesammelt werden.

Bis denne Huck.


----------



## Gast (1. Okt 2008)

Du befindest dich beim Lesen im falschen TAG -> du musst dir merken, dass ein Start TAG kommt => nach dem Start TAG folgt Text

String prevElement = null;
while(reader.hasNext()) {
    int eventType = reader.getEventType();
    if(XMLStreamConstants.START_ELEMENT == eventType)
				prevElement = reader.getLocalName();
    if(prevElement != null)
	if(eventType == XMLStreamConstants.CHARACTERS) {
           // hier kannst du den Text lesen !!!
        }


----------

