Avatar billede decrypto Nybegynder
20. januar 2004 - 09:12 Der er 15 kommentarer og
1 løsning

XML og Java servlets

Hej derude...

Hvis jeg nu vha. en Java servlet får genereret et xml output af en database tabel. Hvordan kan jeg så (over)skrive det i et *.xml dokument på webserveren.

Når alt det første lykkes, hvordan kan jeg så 'loade' et eksternt xml dokument i en servlet og omdanne det til en SQL query, der løber igennem det eksternt 'loadede' xml dokument.

Både modtager og sender er begge indforstået med xml strukturen.

Jeg håber det var til at forstå.

Mvh,
dEcRyPt0
Avatar billede arne_v Ekspert
20. januar 2004 - 10:28 #1
Jeg tror ikke helt at jeg forstår spørgsmålet.

Med passende security opsætning burde en servlet sagtens kunne
skrive en fil.

Og parse en XML fil er det samme i en servlet som i andre
typer programmer.

Og jeg fangede ikke lige hvor SQL kom ind i billedet.
Avatar billede decrypto Nybegynder
20. januar 2004 - 10:46 #2
Jeg deler lige spørgsmålene op i små dele.

1. Hvordan kan jeg skrive noget ned i en fil vha. servlet. Skal man kalde en metode der hedder printWriter eller et eller andet. Jeg vil bare have skrevet noget xml ud i en fil, der ligger lokalt.

2. Når det er sket, så kan en ekstern bruger kalde mit xml dokument, da xml dokumentet ligger på webserveren. URL'en kunne fx. være http://www.etellerandet.dk/xml_dokument.xml

En ekstern kan så vha. xslt transformere dette xml dokument til et eller andet fancy.
Men lad os nu sige at vi også er den eksterne bruge, der også arbejder med Java servlets. Jeg kan vel vha. URL'en kalde xml dokumentet og vel igennem en java servlet traversere dokumenten og 'klippe' dokumentet op i en række SQL queries, jeg kan bruge til at opdatere min database.

Jeg håber du forstod dette.
Avatar billede arne_v Ekspert
20. januar 2004 - 10:51 #3
re 1)

Hvis servlet engine's security opsætning tillader det bør du kunne lave
en ganske almindelig:

PrintStream ps = new PrintStream(new FileOutputStream("filnavn"));
ps.println("tekst");
ps.close();

eller en af de andre måder at skrive tekst filer på i Java.

Du skal lige overveje hvor de filer skal ligges og evt. problemer med
flere samtidige brugere.
Avatar billede arne_v Ekspert
20. januar 2004 - 10:54 #4
re 2)

Hvis filen er midt i et directory som serves af en web server og fil protection
tillader web serveren at læse den, så kan den hentes som URL.

En servlet kan godt hente en fil fra en anden server via HTTP. En servlet kan godt
parse et XML dokument. Så man kan godt lave en servlet der henter et XML
dokument via HTTP, parser det og gemmer data i en database.

Jeg har kode til både "hent URL" og "parse XML" liggende. Ikke i servlet
kontekst, men det er som dagt det samme.
Avatar billede decrypto Nybegynder
20. januar 2004 - 11:01 #5
Jeg kunne godt tænke at se dem, hvis du ikke har noget imod det. Og endnu engang hjælper du mig Arne_v. Mange tak. Jeg har forsøgt at give dig point til nogle af dine andre svar, men ikke alle lykkedes.
Avatar billede arne_v Ekspert
20. januar 2004 - 11:12 #6
Hent URL er normalt noget a la:

          StringBuffer sb = new StringBuffer("");
          URL url = new URL("http://www.eksperten.dk/");
          HttpURLConnection con = (HttpURLConnection)url.openConnection();
          con.connect();
          if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
              InputStream is = con.getInputStream();
              byte[] b = new byte[1000];
              int n;
              while((n = is.read(b)) >= 0) {
                sb.append(new String(b,0,n));
              }
              is.close();
          }
          con.disconnect();
          // sb.toString() indeholder nu hele det hentede dokument
Avatar billede decrypto Nybegynder
20. januar 2004 - 11:14 #7
Hvad gør du inde i løkken?
Avatar billede arne_v Ekspert
20. januar 2004 - 11:15 #8
Og et komplet XML parse eksempel ovenikøbet med lidt SQL indblandet.

test1.xml:

<?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>
<statements>
  <create>
    <statement SQL="CREATE TABLE T1" />
    <statement SQL="CREATE TABLE T2" />
  </create>
  <insert>
    <statement SQL="INSERT INTO T1" />
    <statement SQL="INSERT INTO T2" />
  </insert>
</statements>

Parse1Sax.java:

import java.io.IOException;

import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class Parse1Sax {
  private final static String XML_FILE = "C:\\test1.xml";
  public static void main(String[] args) {
      readXml(XML_FILE);
  }
  private static void readXml(String filename) {
      try {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(new MySaxParser());
        xr.parse(filename);
      } catch (FactoryConfigurationError e) {
        e.printStackTrace();
      } catch (ParserConfigurationException e) {
        e.printStackTrace();
      } catch (SAXException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
  }
}

class MySaxParser extends DefaultHandler {
  private final static int CREATE = 1;
  private final static int INSERT = 2;
  private int mode = 0;
  public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException {
      if(rawName.equals("create")) mode = CREATE;
      if(rawName.equals("insert")) mode = INSERT;
      int sqlix = atts.getIndex("SQL");
      if(sqlix >= 0) {
        switch(mode) {
            case CREATE:
              System.out.println("create statement: " + atts.getValue(sqlix));
              break;
            case INSERT:
              System.out.println("insert statement: " + atts.getValue(sqlix));
              break;
            default:
              break;
        }
      }
      return;
  }
}
Avatar billede arne_v Ekspert
20. januar 2004 - 11:16 #9
Bemærk at man kan parse XML på mange mange forskellige måder.
Avatar billede decrypto Nybegynder
20. januar 2004 - 11:17 #10
Her henter du vel xml dokumentet kan jeg forstå.

Hvordan kan opdaterer du så din base udfra oplysninger i XML dokumentet?
Avatar billede arne_v Ekspert
20. januar 2004 - 11:17 #11
Løkken er bare:

så længe der er mere data læs op til 1000 bytes og append data til resultat
Avatar billede decrypto Nybegynder
20. januar 2004 - 11:17 #12
Ok du har sendt mig svaret.
Avatar billede arne_v Ekspert
20. januar 2004 - 11:19 #13
Det her SAX eksempel er "pænere" rent SAX mæssigt:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class SaxTest {
  private final static String XML_FILE = "C:\\saxtest.xml";
  public static void main(String[] args) {
      ArrayList data1 = new ArrayList();
      data1.add("a");
      data1.add("bb");
      data1.add("ccc");
      data1.add("dddd");
      writeXml(data1, XML_FILE);
      ArrayList data2 = readXml(XML_FILE);
      System.out.println(data2);
  }
  private static void writeXml(ArrayList data, String filename) {
      try {
        PrintWriter pw = new PrintWriter(new FileOutputStream(filename));
        pw.println("<?xml version='1.0' standalone='yes'?>");
        pw.println("<arraylist>");
        for (int i = 0; i < data.size(); i++) {
            pw.println(
              "  <element>" + (String) data.get(i) + "</element>");
        }
        pw.println("</arraylist>");
        pw.close();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      }
  }
  private static ArrayList readXml(String filename) {
      ArrayList result = new ArrayList();
      try {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(new MySaxParser(result));
        xr.parse(filename);
      } catch (FactoryConfigurationError e) {
        e.printStackTrace();
      } catch (ParserConfigurationException e) {
        e.printStackTrace();
      } catch (SAXException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return result;
  }
}

class MySaxParser extends DefaultHandler {
  private StringBuffer element = new StringBuffer();
  private ArrayList result;
  public MySaxParser(ArrayList result) {
      this.result = result;
  }
  public void characters(char buf[], int offset, int len)
      throws SAXException {
      element.append(new String(buf, offset, len));
      return;
  }
  public void startElement(
      String namespaceURI,
      String localName,
      String rawName,
      Attributes atts)
      throws SAXException {
      if (rawName.equals("element")) {
        element = new StringBuffer();
      }
      return;
  }
  public void endElement(
      String namespaceURI,
      String localName,
      String rawName)
      throws SAXException {
      if (rawName.equals("element")) {
        result.add(element.toString());
      }
      return;
  }
}
Avatar billede decrypto Nybegynder
20. januar 2004 - 11:29 #14
Jeg prøver lige med det her.

Mange tak for hjælpen.
Avatar billede decrypto Nybegynder
20. januar 2004 - 11:29 #15
Lad mig lige give dig point.
Avatar billede arne_v Ekspert
20. januar 2004 - 12:03 #16
Så må jeg hellere ligge et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester