# Am Server ankommende XML Daten verarbeiten



## XoxoL (20. Apr 2010)

Hallo allerseits,
ich habe ein, glaub ich, Anfängerproblem. Ich habe ein UDP Socket wo ich auf ankommende XML-Dateien warte und diese sobald sie angekommen sind verarbeiten soll. Genauer gesagt wird die Information aus den XML-Dateien in eine DB-Tabelle geschrieben. Ich bekomme die Dateien und kann den Inhalt auch ausgeben. Das Auslesen einzelner Daten klappt noch nicht und das Ist mein Problem.

Hier ist der Code:


```
import java.io.IOException;
import java.net.*;
import javax.swing.text.Document;
import javax.xml.parsers.ParserConfigurationException;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.xml.sax.*;

public class Main {

    public static void main(String[] args) throws IOException, ParserConfigurationException,    SAXException, JDOMException {
        DatagramSocket socket = new DatagramSocket(44490);
        SAXBuilder builder = new SAXBuilder();
        Document doc;

        int i = 0;
        while (true) {

            //Auf Anfrage warten
            int buflen = socket.getReceiveBufferSize(); //ermittelt die Länge des Packets
            DatagramPacket packet = new DatagramPacket(new byte[buflen], buflen);
            socket.receive(packet);

            // Sender auslesen
            InetAddress address = packet.getAddress();
            int port = packet.getPort();
            int len = packet.getLength();
            byte[] data = packet.getData();

            i++;
            String tmp = new String(data);
            doc = (Document) builder.build(tmp);

            System.out.printf(i + " - Anfrage von %s vom Port %d mit der Länge %d:%n%s%n",
                    address, port, len, tmp);

        }
    }
}
```

und hier glaube ich ist der Hund begraben: doc = (Document) builder.build(tmp);
oder ich muss das Ganze anders gestalte.
Bitte gent mir einen Anstoß.....


----------



## Noctarius (20. Apr 2010)

Was passiert denn nicht? Gibt es eine Fehlermeldung oder oder oder?


----------



## XoxoL (20. Apr 2010)

das habe ich vergessen, folgenden Fehler bekomme ich beim Ausführen:

Exception in thread "main" java.net.MalformedURLException: no protocol: <?xml version="1.0" ?><DATA>


----------



## Gast2 (20. Apr 2010)

```
String tmp = new String(data);
```

*Java-API für 'new String(byte [] value)'*

_Constructs a new String by decoding the specified array of bytes using the platform's default charset. The length of the new String  is a function of the charset, and hence may not be equal to the length of the byte array._

Default-Werte sind immer Mist wenn Sie Aufgrund der Platform existieren ... Platform A verwendet UTF-8 ... Platform B verwendet UTF-32 ... und schon kommt bei einer Platform Müll raus ... gib mal auf beiden Seiten das Encoding mit an (z.B. UTF-8)

ansonsten verwende nach Möglichkeit TCP statt UDP ... mit UDP hast Du nur Probleme ... vor allem wenn das Paket beim Client (oder dazwischen) fragmentiert wird und der zweite Teil vor dem Ersten ankommt ... dann hast Du definitiv kein XML mehr


```
int buflen = socket.getReceiveBufferSize();
```
das ermittelt nur wieviel Bytes im Puffer sind - das ist aber nie die Länge die der Client geschickt hat


----------



## Noctarius (20. Apr 2010)

Musst du denn unbedingt über SAX parsen?


```
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
final DocumentBuilder builder = factory.newDocumentBuilder();
final Document document = builder.parse(new StringInputStream(xmlcode));
```

(PS: Vielleicht reicht dir auch der Parser aus der Signatur bei mir)


----------



## Gast2 (20. Apr 2010)

XoxoL hat gesagt.:


> das habe ich vergessen, folgenden Fehler bekomme ich beim Ausführen:
> 
> Exception in thread "main" java.net.MalformedURLException: no protocol: <?xml version="1.0" ?><DATA>





mogel hat gesagt.:


> gib mal auf beiden Seiten das Encoding mit an (z.B. UTF-8)



den Fehler bekomme ich auch immer wieder ... da dürfte der BOM am Anfang liegen


----------



## Murray (20. Apr 2010)

mogel hat gesagt.:


> den Fehler bekomme ich auch immer wieder ... da dürfte der BOM am Anfang liegen


In diesem Fall hat es aber mit dem Encoding nichts zu tun - wie in Noctarius Beispiel muss man dem DocBuilder einen Stream mit den Daten geben; einen String interpretiert er nämlich als URL, und das muss ja schiefgehen.


----------



## Gast2 (20. Apr 2010)

ick habs heute nicht so mit dem lesen ... _MalformedURLException_


----------



## XoxoL (20. Apr 2010)

TCP wäre mir auch lieber aber das ist zu langsam ich bekomme ca. 1000 XML's pro minute deswegen will ich den Parser nutzen. Ich könnte den String in Einzelteile zerlegen und so die Daten raus hollen aber es geht mir alle um geschwindigkeit.

```
int buflen = socket.getReceiveBufferSize();
```
der Gedanke war das nicht immer begrentzten buffer habe den die Dateien sin untersciedlich lang und ich will das es alles ankommt.....

was ist eure Meinung? wie kann die daten am einfachsten und am schnelsten in eine DB-Tabelle schreiben?


----------



## Noctarius (20. Apr 2010)

TCP zu langsam? Oo

Wenn du einen richtigen TCP Server mit NIO aufbaust und dahinter einen Threadpool zur Bearbeitung der XML Daten legst sollte das kein Problem sein.


----------



## XoxoL (20. Apr 2010)

die Daten bekomme ich ja. Ich weis nur nicht wie ich die Daten auswerten und in die DB-Tabelle schreiben kann


----------



## XoxoL (21. Apr 2010)

für alle das gleiche Problem haben:


```
public static void main(String[] args) throws SocketException, JDOMException, IOException {
        DatagramSocket socket = new DatagramSocket(44490);
        
        XMLOutputter out = new XMLOutputter(Format.getPrettyFormat());

        int i = 0;
        while (true) {

            //Auf Anfrage warten

            int buflen = socket.getReceiveBufferSize(); 
            DatagramPacket packet = new DatagramPacket(new byte[buflen], buflen);
            socket.receive(packet);
            ByteArrayInputStream byteIn = new ByteArrayInputStream(packet.getData(), 0, packet.getLength());
            DataInputStream dataIn = new DataInputStream(byteIn);

            String tmp = new String(dataIn.toString());
            org.jdom.Document doc = new SAXBuilder().build(dataIn);
            out.output(doc, System.out);
        }
    }
```


----------

