XLM feldolgozás Java-ban (characters használata)

XLM feldolgozás Java-ban (characters használata)
2009-12-09T15:05:54+01:00
2009-12-14T15:30:51+01:00
2022-11-16T00:25:38+01:00
joeyfiu
Sziasztok,

A következő problémával küzdök, kérlek segítsetek:

Java-ban a SaxNames osztály characters metódusának felhasználásával szeretnék XML nyitó és záró tagek közül kivadászni SQL utasításokat és aztán ezeket egyenként felgyűjteni mondjuk String típusú tömbbe (ezek teljesen változóak, általában csak INSERT/UPDATE/DELETE, de néha becsúszik 1-1 function vagy view definíció is).

Példa:

<sqltext error_level="0" type="DML" id="1">
CREATE OR REPLACE procedure sp_get_last_mnyp(in_tsz IN NUMBER ,in_date IN DATE ,bbmp_kod OUT NUMBER, bbmp_belkelte OUT DATE, bbmp_kilkelte OUT DATE) IS
w_ret NUMBER(4):=0;
BEGIN

BEGIN
SELECT bbmp_kod,belkelte,kilkelte INTO w_ret, bbmp_belkelte, bbmp_kilkelte FROM bbmpstor WHERE in_date BETWEEN belkelte AND Nvl(kilkelte,in_date)
AND bbm_bbst_torzsszam=in_tsz;
EXCEPTION WHEN No_Data_Found then
w_ret:=0;
END;
bbmp_kod:=Nvl(w_ret,0);

END;

</sqltext>

A problémám az, hogy a példában lévő eljárás definíciójának characters-el való kiszedésekor elhasal, NullPointerException-t dob már az első BEGIN után.

Hogy lehet ezt korrekten megfogni? Lehet, hogy a characters működésével kapcsolatban vannak fogalmi zavaraim. :S
Mutasd a teljes hozzászólást!
Csak a módosított részt másolom be:

public void characters(char buf[], int offset, int len) throws SAXException { if(buffer != null) { String s = new String(buf, offset, len); buffer.append(s.trim() + "\r\n"); } } public void endElement(String uri, String localName, String rawName) { if(buffer != null) { sqlcmds.addElement(buffer.toString()); } buffer = null; }
Mutasd a teljes hozzászólást!

  • Egyszerűbb volna megmondani mi a gond ha küldenél forráskódot.
    Mutasd a teljes hozzászólást!
  • Jogos a felvetésed, bocsi!

    Megpróbálok forráskódot beilleszteni. Az sqlt egy boolean, amit true-ra állítok, a startElement-ben, ha <sqltext> tag-hez ér.
    Az i pedig a tömbindex lenne, de most nincs jelentősége, mert a tömb helyett egy stringbufferbe próbálom felgyűjteni, amit a characters kiszed. Tehát a kérdés továbbra is: miért van folyton NullPointerException?

    public void characters(char buf[], int offset, int len) throws SAXException { String s = new String(buf, offset, len).trim(); if (sqlt) { try { if (s!=null && i>=0){ update.cursqlbuff.append(s.replace(null," ")); } } catch (java.lang.NullPointerException npe) { System.out.println("Npe: "+npe.getMessage()+" Cv: "+i+" characters: " + s); } sqlt=false; } }
    Mutasd a teljes hozzászólást!
  • Kevés az infó. Az egész osztályt pls.
    Mutasd a teljes hozzászólást!

  • package upman; //import java.util.ArrayList; //import java.util.Arrays; //import java.util.List; //import java.util.Properties; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; public class SaxNames extends DefaultHandler { private boolean sqlt = false; private int i=1; @Override public void startElement(String uri, String localName, String rawName, Attributes attributes) { //System.out.println(rawName); if ("version".equals(rawName)) { update.setCurversion(Integer.valueOf(attributes.getValue("ver"))); if (Integer.valueOf(attributes.getValue("ver"))> update.getLastversion()) { update.newupdate=true; } } if ("message".equals(rawName)) { update.setCurmessage(attributes.getValue("text")); } if ("file".equals(rawName)) { update.setCurzipname(attributes.getValue("name")); } if ("sqltext".equals(rawName)) { sqlt=true; } } public void characters(char buf[], int offset, int len) throws SAXException { String s = new String(buf, offset, len).trim(); if (sqlt) { try { if (s!=null && i>=0){ update.cursqlbuff.append(s.replace(null," ")); } } catch (java.lang.NullPointerException npe) { System.out.println("Npe: "+npe.getMessage()+" Cv: "+i+" characters: " + s); } //System.out.println("Cv: "+i+" characters: " + s); sqlt=false; } } public void endElement(String uri, String localName, String rawName) { if ("sqltext".equals(rawName)) { sqlt=false; i++; } } public static void main() { } }
    Mutasd a teljes hozzászólást!
  • A Vector minden eleme egy sql utasitast fog tartalmazni:

    import java.io.File; import java.util.Vector; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class SaxNames extends DefaultHandler { private StringBuffer buffer; private Vector<String> sqlcmds = new Vector<String>(); public void startElement(String uri, String localName, String rawName, Attributes attributes){ rawName = rawName.toLowerCase(); if("sqltext".equals(rawName)) { buffer = new StringBuffer(); } } public void characters(char buf[], int offset, int len) throws SAXException { String s = new String(buf, offset, len); if(buffer == null) { return; } s = s.trim(); String sl = s.toLowerCase(); if (sl.startsWith("select") || sl.startsWith("insert") || sl.startsWith("update") || sl.startsWith("create")) { buffer.append(s); sqlcmds.addElement(s); } } public void endElement(String uri, String localName, String rawName) { if(buffer != null) { // ...... } buffer = null; } public final Vector getCommands() { return sqlcmds; } public static void main(String[] args) { try { SaxNames saxNames = new SaxNames(); SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); parser.parse(new File("sql.xml"), saxNames); for (int i=0; i<saxNames.getCommands().size(); i++) { System.out.println("----------------------"); System.out.println(saxNames.getCommands().elementAt(i)); } } catch(Exception e) { e.printStackTrace(System.err); } } }
    Mutasd a teljes hozzászólást!
  • Húha, köszönöm, ki fogom próbálni!
    Mutasd a teljes hozzászólást!
  • Mester, ez már majdnem teljesen az, amit én szeretnék! Annyi a problémám vele, hogy a példa esetében a PROCEDURE definíciót felbontja 7 elemre:



    CREATE OR REPLACE procedure sp_get_last_mnyp(in_tsz IN NUMBER ,in_date IN DATE ,bbmp_kod OUT NUMBER, bbmp_belkelte OUT DATE, bbmp_kilkelte OUT DATE) IS
    w_ret NUMBER(4):=0;
    ----------------------
    BEGIN

    BEGIN
    ----------------------
    SELECT bbmp_kod,belkelte,kilkelte INTO w_ret, bbmp_belkelte, bbmp_kilkelte FROM bbmpstor WHERE in_date BETWEEN belkelte AND Nvl(kilkelte,in_date)
    AND bbm_bbst_torzsszam=in_tsz;
    ----------------------
    EXCEPTION WHEN No_Data_Found then
    w_ret:=0;
    ----------------------
    END;
    bbmp_kod:=Nvl(w_ret,0);
    ----------------------
    END;



    Ez egy Vectorelem kellene hogy legyen. Tehát ami egy sqltext nyitó és záró tag közt van, az egy elem.

    Megköszönném, ha erre tudnál még javasolni valamit!
    Mutasd a teljes hozzászólást!
  • Csak a módosított részt másolom be:

    public void characters(char buf[], int offset, int len) throws SAXException { if(buffer != null) { String s = new String(buf, offset, len); buffer.append(s.trim() + "\r\n"); } } public void endElement(String uri, String localName, String rawName) { if(buffer != null) { sqlcmds.addElement(buffer.toString()); } buffer = null; }
    Mutasd a teljes hozzászólást!
  • Köszönöm, szuper jó!
    Mutasd a teljes hozzászólást!
  • Szivesen.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd