Avatar billede mungojerrie Nybegynder
14. juni 2004 - 11:34 Der er 10 kommentarer og
1 løsning

Lidt hjælp til xml i java

Jeg har en klasse som skal returnere et xml document:

metoden ser sådan ud:

public Document createXmlDocument(ResultSet rs){
    try {
        ResultSet rsdata = rs;
        Document doc = getXmlDocument();
        ResultSetMetaData metadata = rsdata.getMetaData();
       
        root = doc.createElement(rootName);
   
        while (rsdata.next())
        {
            //hent id           
            parent = doc.createElement(parentName);
            parent.setAttribute("id", ""+rsdata.getInt("id"));

        }
        root.appendChild(parent);
        doc.appendChild(root);
        return doc;
       
    }
    catch(Exception ex){
        ex.printStackTrace();
    }
    return null;
}

variabel erklæringer :
    private Element root = null;
    private Element parent = null;
    private Element element = null;
    private Document xmlDoc = null;
       
    private static String rootName = "Adressekartotek";
    private static String parentName = "Customer";

mit resultset bliver dannet her :

public ResultSet getData(DbConnection con){
    String sql;
    sql = "SELECT * FROM SMSKARTOTEK";
    ResultSet rs = null;
    try{
        stm = con.createStatement();
        rs = stm.executeQuery(sql);
    }       
    catch(SQLException e){e.printStackTrace();}
    catch(Exception e){e.printStackTrace();}
       
    return rs;
}   

tabellen i db ser sådan ud:

CREATE TABLE SMSKARTOTEK(
id integer not null identity primary key,
mobilnr varchar(10) not null,
fornavn varchar(255) not null,
efternavn varchar(255) not null,
vejnavn varchar(255) not null,
husnr varchar(10) not null,
postnr integer(4) not null,
altnr varchar(10) not null,
dato Timestamp not null,
fritekst LONGVARCHAR not null,
fonetisk_fornavn varchar(4) not null,
fonetisk_efternavn varchar(4) not null
)

Jeg vil gerne have min metode createXmlDocument til at levere dette xml dokument:

<Adressekartotek>
<Customer id="1", timestamp="2004-14-06 17:45:00.000">
<mobilnr>88888888</mobilnr>
<fornavn>hans</fornavn>
og så fremdeles for hvert felt i databasen
</Customer>
</Adressekartotek>

Der skal laves en <customer> for hver row i db'en

Er der noget som kan brygge videre på det jeg har lavet ?
Avatar billede backupmand Nybegynder
14. juni 2004 - 16:34 #1
Jeg kan sige, at du kan/skal bruge disse metoder:
createElement fra Document interfacet og
appendChild fra Element.
Muligvis vil du kunne finde anvendelse af
createTextNode metoden, også fra Document interfacet.
Et lille, men ikke ubetydeligt skub fremad!
Avatar billede backupmand Nybegynder
14. juni 2004 - 16:38 #2
Nå ja, så lige at du havde lavet noget lignende .. hvordan ser din getXmldocument() metode egentlig ud?
Avatar billede backupmand Nybegynder
14. juni 2004 - 17:12 #3
Her er en metode, der laver et XML dokument baseret på de informationer du har givet foroven,... måske kan du så bare kalde den via en for løkke eller lign... eller tage det du kan bruge fra den .. hvis altså din getXmldocument() returnerer det rigtige

public Docoument createXmlDocument(String kundeId, String tid, String mobil, String fornavn)                           
    {
    Document doc=getXmlDocument();   
    Element root=(Element)doc.getDocumentElement();   
   
    // oprettelse af elementer / tags       
    Element rod=doc.createElement("Adressekartotek");
    Element kunde=doc.createElement("Customer");   
    kunde.setAttribute("id", kundeId); // kunde attributter
    kunde.setAttribute("timestamp",tid); // kunde attributter
    Element mobil=doc.createElement("mobil");
    Element fnavn=doc.createElement("fornavn");
   
    root.appendChild(rod);
       
    rod.appendChild(kunde);
    rod.appendChild(mobil);
    rod.appendChild(fnavn);   
   
    mobil.appendChild(doc.createTextNode(mobil));
    fnavn.appendChild(doc.createTextNode(fornavn));
    return doc;
    }
Avatar billede mungojerrie Nybegynder
15. juni 2004 - 12:48 #4
jeg afprøver lige.....
Avatar billede mungojerrie Nybegynder
15. juni 2004 - 13:08 #5
Det duede jo bare..... :-)

public Document createXmlDocument(DbConnection dbcon){
    try {
        ResultSet rsdata = getData(dbcon);
        Document doc = getXmlDocument();
        ResultSetMetaData metadata = rsdata.getMetaData();
       
        root = doc.createElement(rootName);
   
        while (rsdata.next())
        {
            //id           
            parent = doc.createElement(parentName);
            parent.setAttribute("id", ""+rsdata.getInt("id"));
            parent.setAttribute("timestamp", ""+rsdata.getTimestamp("dato"));


            //mobilnr           
            element = doc.createElement(metadata.getColumnName(2));
            element.appendChild(doc.createTextNode(rsdata.getString("MOBILNR")));
            parent.appendChild(element);

            //fornavn
            element = doc.createElement(metadata.getColumnName(3));
            element.appendChild(doc.createTextNode(rsdata.getString("FORNAVN")));
            parent.appendChild(element);

            //efternavn
            element = doc.createElement(metadata.getColumnName(4));
            element.appendChild(doc.createTextNode(rsdata.getString("EFTERNAVN")));
            parent.appendChild(element);
           
            //vejnavn
            element = doc.createElement(metadata.getColumnName(5));
            element.appendChild(doc.createTextNode(rsdata.getString("VEJNAVN")));
            parent.appendChild(element);               

            //husnr
            element = doc.createElement(metadata.getColumnName(6));
            element.appendChild(doc.createTextNode(rsdata.getString("HUSNR")));
            parent.appendChild(element);               

            //postnr
            element = doc.createElement(metadata.getColumnName(7));
            element.appendChild(doc.createTextNode(""+rsdata.getInt("POSTNR")));
            parent.appendChild(element);               

            //altnr
            element = doc.createElement(metadata.getColumnName(8));
            element.appendChild(doc.createTextNode(rsdata.getString("ALTNR")));
            parent.appendChild(element);               

            //dato
            element = doc.createElement(metadata.getColumnName(9));
            element.appendChild(doc.createTextNode(""+rsdata.getTimestamp("DATO")));
            parent.appendChild(element);               

            //fritekst
            element = doc.createElement(metadata.getColumnName(10));
            element.appendChild(doc.createTextNode(rsdata.getString("FRITEKST")));
            parent.appendChild(element);               

            //fonetisk_fornavn
            element = doc.createElement(metadata.getColumnName(11));
            element.appendChild(doc.createTextNode(rsdata.getString("FONETISK_FORNAVN")));
            parent.appendChild(element);               

            //fonetisk_efternavn
            element = doc.createElement(metadata.getColumnName(12));
            element.appendChild(doc.createTextNode(rsdata.getString("FONETISK_EFTERNAVN")));
            parent.appendChild(element);               

        }
        root.appendChild(parent);
        doc.appendChild(root);
        return doc;
       
    }
    catch(Exception ex){
        ex.printStackTrace();
    }
    return null;
}

sådan ser min getXmlDocument ud:

public Document getXmlDocument(){

    try {

        //Create a XML Document
        DocumentBuilderFactory dbFactory = DocumentBuilderFactoryImpl.newInstance();
        DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
        xmlDoc = docBuilder.newDocument();

    } catch(Exception e) {
        System.out.println("Error " + e);
    }
    return xmlDoc;
}

smid lige et svar
Avatar billede backupmand Nybegynder
15. juni 2004 - 13:19 #6
Cool
Avatar billede arne_v Ekspert
15. juni 2004 - 19:25 #7
Spørgsmålet er jo lukket men jeg vil alligevel poste et lille stykke kode
som jeg synes er interessant:

import java.sql.*;

import javax.xml.parsers.*;

import org.w3c.dom.*;

import org.apache.xml.serialize.*;

public class SQL2XML {
    public static Document rs2xml(ResultSet rs) throws SQLException, ParserConfigurationException {
        ResultSetMetaData rsmd = rs.getMetaData();
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.newDocument();
        Element rows = doc.createElement("rows");
        doc.appendChild(rows);
        while(rs.next()) {
            Element row = doc.createElement("row");
            for(int i = 1; i <= rsmd.getColumnCount(); i++) {
                Element f = doc.createElement(rsmd.getColumnName(i));
                f.appendChild(doc.createTextNode(rs.getString(i)));
                row.appendChild(f);
            }
            rows.appendChild(row);
        }
        return doc;
    }
    public static Document query2xml(Connection con, String sqlstr) throws SQLException, ParserConfigurationException {
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(sqlstr);
        return rs2xml(rs);
    }
    public static void main(String[] args) throws Exception {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection con = DriverManager.getConnection("jdbc:odbc:TestMSAccess");
        OutputFormat fmt = new OutputFormat();
        fmt.setIndenting(true);
        XMLSerializer ser = new XMLSerializer(System.out, fmt);
        ser.serialize(query2xml(con,"SELECT * FROM T1"));
        ser.serialize(query2xml(con,"SELECT F2,COUNT(*) AS N FROM T1 GROUP BY F2"));
    }
}
Avatar billede mungojerrie Nybegynder
15. juni 2004 - 20:10 #8
ser godt ideen med din klasse, men bliver der ikke et problem med denne linje:
f.appendChild(doc.createTextNode(rs.getString(i)));
hvis man benytter andre felttyper end varchar, text og char ????
Avatar billede arne_v Ekspert
15. juni 2004 - 20:13 #9
Nej.

rs.getString(ix) på et integer felt returnerer feltværdien som String (123 som "123").

Ihvertfald på de database jeg har prøvet.
Avatar billede backupmand Nybegynder
15. juni 2004 - 20:44 #10
Ret interessant, synes jeg da også.
Avatar billede mungojerrie Nybegynder
16. juni 2004 - 12:29 #11
du har skam ret arne, det virker jo fint, troede bare ikke det ville virke, da jeg tænkte at det virkede lidt på samme måde som med preparedstatement, hvor man skal bruge den rigtige "get" i forhold til felttypen.
Takker for tippet :-)
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