# XML String auslesen



## Happyman0815 (26. Jul 2009)

Hallo Leute!


Ich probiere mich derzeit in XML-Techniken und muss jetzt einen XML-String parsen.

Folgendes recht einfaches Beispiel habe ich gefunden, was ich auf meinen Fall gerne Ableiten möchte:

//****************Bsp. Anfang

Folgende XML-Datei ist gegeben:

```
<?xml version="1.0" encoding="UTF-8"?>
<root>
     <port>1</port>
     <baud>9600</baud>
     <bit>1</bit>
     <parity>0</parity>
</root>
```


Diese XML-DAtei kann man laut Beispiel nun wie folgt parsen und ausgeben:

```
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;


public class TestEventStaX {
    private String configFile;

    public void setFile(String configFile) {
        this.configFile = configFile;
    }
   
   
    public void readConfig() {
        try {
            // zuerst eine neue XMLInputFactory erstellen
            XMLInputFactory inputFactory = XMLInputFactory.newInstance();
            // einen neuen eventReader einrichten
            InputStream in = new FileInputStream(configFile);
            XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
            // das XML-Dokument lesen
            while (eventReader.hasNext()) {
                XMLEvent event = eventReader.nextEvent();
               
                if (event.isStartElement()) {
                    if (event.asStartElement().getName().getLocalPart() == ("port")) {
                        event = eventReader.nextEvent();
                        System.out.println(event.asCharacters().getData());
                        continue;
                    }
                    if (event.asStartElement().getName().getLocalPart() == ("baud")) {
                        event = eventReader.nextEvent();
                        System.out.println(event.asCharacters().getData());
                        continue;
                    }
                    if (event.asStartElement().getName().getLocalPart() == ("bit")) {
                        event = eventReader.nextEvent();
                        System.out.println(event.asCharacters().getData());
                        continue;
                    }
                    if (event.asStartElement().getName().getLocalPart() == ("parity")) {
                        event = eventReader.nextEvent();
                        System.out.println(event.asCharacters().getData());
                        continue;
                    }
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }
    }
   
   
   
    public static void main(String args[]) {
        TestEventStaX read = new TestEventStaX();
        read.setFile("root.xml");
        read.readConfig();
    }
}//End Class
```


//****************Bsp. Ende


*Dieses Beipiel unterscheidet sich in 3 Sachen von meinem Fall:*
1.: Es liest eine XML Datein ein  "read.setFile("root.xml");", bei mir ist es ein String.
2.: Es gibt keine Attribute (ich hoffe das war jetzt richtig :autsch
3.: Die geparsten Elemente sollen nicht ausgegeben werden sonder in Variablen gespeichert werden.


*Mein XML String:*

Mein zu parsender XML String hat folgende Struktur:

```
<my_XML Type="foo">
      <my_int1 var1="2" />
      <my_int2 var2="0" />
      <Messsage>hallo ich bin eine test Message</Message>
</my_XML>
```

*Nun meine Fragen:*

1. Wie bekomme ich es hin, das er einen String parst anstatt eine Datei einliest?

2. Im obigen Beispiel wird mir gezeigt wie ich (in meinem Beispiel) auf my_int1, my_int2 und auf Message zugreifen kann. Allerdings nicht, wie ich auf var1 und var2 (das müssten die Attribute sein??) zugreifen kann. 
Dahre --> Wie muss ich den Beispielcode erweitern um darauf zuzugreifen?

3. Ich möchte die extrahierten Daten nicht ausgeben, sondern in Variablen abspeichern. Wie mache ich das?
Evtl. so?:


```
char[] array1 = new char[1000] ;
array1 = event.asCharacters().getData();
```

Ich hoffe jemand kann mir dabei ein bisschen helfen. Ich komm an dieser Stelle nichtmehr so wirklich weiter.:roll:

Gruß
Happyman0815


----------



## SlaterB (26. Jul 2009)

createXMLEventReader(new StringReader(string));

wann immer irgendwas mit irgendeiner Information gemacht wird, kann man sie an dieser Stelle genauso gut in einer lokalen Variablen oder einem Klassenattribut speichern:
variable = irgendwas;

> char[] array1 = new char[1000] ;
> array1 = event.asCharacters().getData();

das 1000er-Array wäre ganz umsonst erzeugt,

char[] array1 = null;
array1 = event.asCharacters().getData();
oder
char[] array1 = event.asCharacters().getData();
reicht völlig, falls da ein char[] kommt


----------



## Happyman0815 (26. Jul 2009)

createXMLEventReader(new StringReader(string)); <-- Das funktioniert. Damit ist Frage 1  geklärt. Danke!


Frage 3 ist annäherd gelöst. Mit dem 1000èr Array hast du natürlich recht!


Bleibt hauptsächlich noch Frage 2. 


Gruß
Happyman0815


----------



## SlaterB (26. Jul 2009)

ich kenne das genauso wenig,
aber was kann ich machen?
XMLEvent in google eintippen
->
XMLEvent (Java Platform SE 6)
da gibt es also eine Methode isAttribute(), die wird hilfreich sein,

dann steht da noch " All Known Subinterfaces:     Attribute, Characters,.."
wahrscheinlich kann man es noch auf Attribute casten,
und dann die weiteren Methoden von Attribute

kann sein, dass das Konstrukt
if (startElement  == ("port")) {
                        event = eventReader.nextEvent();
                        System.out.println(event.asCharacters().getData());
}
dann nicht mehr funktionieren wird, weit das nächste Element nach dem StartElement das Attribute sein wird,
einfach genau anschauen, welche Events in welcher Reihenfolge kommen

vielleicht sind die Attribute auch keine Events und man muss vom StartElement 
getAttributes() 
aufrufen,
alles in der API zu sehen


----------



## Happyman0815 (26. Jul 2009)

So ich habe nun 5 Stunden basteln die ********* voll gehabt und habe mir ein Beispiel von "JJava ist auch eine Insel" gekrallt.


siehe Link "15.4.3 XML-Dateien mit dem Iterator-Verfahren verarbeiten"

oder:


```
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

...


InputStream in = new FileInputStream( "party.xml" ); 
XMLInputFactory factory = XMLInputFactory.newInstance(); 
XMLEventReader parser = factory.createXMLEventReader( in ); 
 
StringBuilder spacer = new StringBuilder(); 
while ( parser.hasNext() ) 
{ 
  XMLEvent event = parser.nextEvent(); 
 
  switch ( event.getEventType() ) 
  { 
    case XMLStreamConstants.START_DOCUMENT: 
      System.out.println( "START_DOCUMENT:" ); 
      break; 
    case XMLStreamConstants.END_DOCUMENT: 
      System.out.println( "END_DOCUMENT:" ); 
      parser.close(); 
      break; 
    case XMLStreamConstants.START_ELEMENT: 
      StartElement element = event.asStartElement(); 
      System.out.println( spacer.append("  ") 
                          + "START_ELEMENT: " 
                          + element.getName() ); 
      for ( Iterator<?> attributes = element.getAttributes(); 
            attributes.hasNext(); ) 
      { 
        Attribute attribute = (Attribute) attributes.next(); 
        System.out.println( spacer + "  Attribut: " 
                            + attribute.getName() + " Wert: " 
                            + attribute.getValue() ); 
      } 
      break; 
    case XMLStreamConstants.CHARACTERS: 
      Characters characters = event.asCharacters(); 
      if ( ! characters.isWhiteSpace() ) 
        System.out.println( spacer 
                            + "  CHARACTERS: " 
                            + characters.getData() ); 
      break; 
    case XMLStreamConstants.END_ELEMENT: 
      System.out.println( spacer 
                          + "END_ELEMENT: " 
                          + event.asEndElement().getName() ); 
      spacer.delete( (spacer.length() – 2), spacer.length() ); 
      break; 
    case XMLStreamConstants.ATTRIBUTE: 
      break; 
 
    default : 
      break; 
  } 
}
```


Dieses Beispiel nimmt quasi jede XML Datei auseinander.

Den EventReader erstetzt mit "createXMLEventReader(new StringReader(string));" und zack funktioniert alles so wie es soll!!! 


Danke für die Hilfe!

Gruß
Happyman0815


----------

