» »

Java - uvoz XML in izvoz v MySQL pomoč

Java - uvoz XML in izvoz v MySQL pomoč

igor0203 ::

Pozdravljeni!

Rabil bi eno pomoč pri izdelavi java programčka in sicer sledeče:

Imam XML dokument v kateri je shranjena vsebina oz. tabela/e. Kako bi ta dokument prebral in zapisal njegovo vsebino v MySQL tabelo?

Lp,
Igor

kopernik ::

Imaš specifične težave z branjem xml datoteke ali MySql bazo?

Ali mogoče niti ne veš kje sploh začeti (uporaba xml datotek in podatkovnih baz v javi)?

Če ne veš, kje začeti, predlagam, da najprej pogledaš tole knjižnico za branje xml-a, še posebej "cookbook", kjer imaš nanizanih nekaj preprostih primerov. Se mi zdi zelo primerna, ker nima tako zaštrikanega API-ja kot default javanski razredi za delo z xml-om. PRedvsem iz stališča začetnika.

Zgodovina sprememb…

  • spremenil: kopernik ()

igor0203 ::

V bistvu ne vem niti kje začeti. Poznam sicer osnove programiranja, vendar v Javi prej nisem nikoli programiral.
Mi je pa šef sedaj dal zgoraj omenjeno nalogo. Na netu sem našel tutorial kako se uvozi in pač razumem kaj in zakaj, ne vem pa kako bi prebral tabelo v XML fajlu in jo zapisal v MySQL(narediti in zapisati v MySQL tabelo pa znam).

kopernik ::

Ok, imaš nalogo prebrati xml datoteko in njeno vsebino zapisati v ustrezno mysql tabelo. Sklepam, da so podatki v xml-u hierarhični, zato moraš najprej premisliti, kako jih boš spravil v tabelarično obliko. Če gre bolj za učenje uporabe Jave, potem verjetno nimaš kakšne kompleksne xml datoteke, zato ti verjetno to ne bo delalo težav.

Torej, predpostavljam, da imaš primer xml-a in tudi, da že imaš narejeno tabelo oz. več tabel v mysql-u. Ostane ti samo še, da pogledaš kakšen tutorial za branje xml datotek (praviš, da si že) in še en tutorial za povezovanje na mysql bazo (tukaj imaš en primer).

V glavnem, sprehodiš se čez vse tage v xml-u in sproti vstavljaš ustrezne podatke v bazo. Za konkretne napotke pa prilepi primer xml datoteke in strukturo mysql tabel.

igor0203 ::

Hja v bistvu sem imel sedaj en teden časa, da sem se malce spoznal z javo, danes pa sem dobil malce konkretnejšo nalogo. :)
Je pa kar kompleksna xml datoteka, velikost je nekaj čez 14MB, tako da je notri kar precej zapisov.

Primer samo ene izmed mnogih vrstic v xml datoteki, s tem da niso vse vrstice enako, kakšna ima kak zapis več, kakšna kak zapis manj...

<Tr rn=\"999999999999999\" vr=\"T\" sSpre=\"S\" reg=\"P\" dSpre=\"2010-09-30\" dOdprt=\"2000-01-01\" iban=\"SI56\" eno=\"R\" vir=\"R\" maticnaPps=\"00000000\"><Imetnik davcna=\"0000000\" matSub=\"0000000\" drz=\"705\"><PopolnoIme>NEZNANA OSEBA</PopolnoIme><KratkoIme>NEZNANA OSEBA</KratkoIme><Naslov sifTipNaslova=\"01\" sifObcina=\"039\" sifPosta=\"1303\" sifUlica=\"0000\" sifNaselje=\"059\" stHisna=\"027\" sifHsmid=\"11694551\"><Obcina>LJUBLJANA</Obcina><Posta>LJUBLJANA</Posta><Ulica>SLOVENSKA CESTA 1</Ulica><Naselje>CENTER</Naselje></Naslov></Imetnik></Tr>

kopernik ::

Kaj točno misliš s tem, da je kakšen zapis več ali manj? Misliš to, da ima lahko en račun (Tr) več imetnikov in posamezen imetnik več naslovov? Če je tako, potem boš moral narediti v mysql tri tabele z one-to-many relacijo. Ne vem, ugibam, ker ni jasno, kaj si s tem mislil.

V glavnem, na hitro malo naivne kode, nič testirano zato so zihr noter kakšne napake, ampak da vsaj dobiš malo idej, kako začeti. Zakaj naivne ? Ker se ne ukvarjam z baznimi ključi, foreign key-i, izjemami, hitrostjo rešitve, ipd. Predpostavljam, da uporabiš že omenjeno dom4j knjižnico, ampak tudi če je ne boš uporabil, bo koda podobna, samo klical boš druge metode in malo drugače iteriral čez vsebino xml dokumenta. Malo naprednejša uporaba: če hočeš, da bo delalo spodobno hitro, moraš na tabelah izključiti indexe in constrainte, v javi pa uporabljati batch update (pošiljaš naenkrat več insert stavkov, malo poguglaj).

public class MyClass {
  private static Connection con;
  private static Document xml;
  private static PreparedStatement trPstmt;
  private static PreparedStatement imetnikPstmt;
 
  public static void main(String args[]) throws Exception {
    try {
      initDB();
      initXml();

      Element root = xml.getRootElement();
      // sprehodi se cez vse 'Tr' tage
      for ( Iterator i = root.elementIterator("Tr"); i.hasNext();) {
        Element tr = (Element) i.next();
        insertTr(
            tr.attributeValue("rn"),
            tr.attributeValue("vr"),
            tr.attributeValue("sSpre"),
            tr.attributeValue("reg"),
            tr.attributeValue("dSpre"));
               
        // sprehodi se čez vse imetnike na tr-ju
        for ( Iterator i2 = tr.elementIterator("Imetnik"); i2.hasNext();) {
          Element imetnik = (Element) i2.next();
          insertImetnik(
            tr.attributeValue("rn"),
            imetnik.attributeValue("davcna"),
            imetnik.elementText("PopolnoIme"),
            imetnik.elementText("KratkoIme"));
        }
      }
    } finally {
      con.close();
    }
  }

  private static void initDB() {
    Class.forName("com.mysql.jdbc.Driver");
    String url = "jdbc:mysql://localhost:3306/DBname";
    con = DriverManager.getConnection(url, "user", "passwd");
    trPstmt = con.prepareStatement(
        "insert into tr (rn, vr, sSpre, reg, dSpre) values(?, ?, ?, ?, ?)");
    imetnikPstmt = con.prepareStatement(
        "insert into imetnik (tr_rn, davcna, popolno_ime, kratko_ime) values(?, ?, ?, ?)");
  }
 
  private static void initXml() {
    SAXReader reader = new SAXReader();
    xml = reader.read(new FileInputStream("/path/to/file"));
  }

  // Uporabljam varargs sintakso, da je klicanje metode bolj pregledno.
  // Naivno pričakujem, da bo klicatelj poslal vsaj 5 parametrov 
  // in to v pravilnem vrstnem redu.
  // Zakaj 5 ? ker se mi ni dalo tipkati za vseh 20 atributov
  private static void insertTr(String ... params) {
    trPstmt.setString(1, params[0]);
    trPstmt.setString(2, params[1]);
    trPstmt.setString(3, params[2]);
    trPstmt.setString(4, params[3]);
    trPstmt.setString(5, params[4]);
      
    trPstmt.executeUpdate();
  }

  private static void insertImetnik(String ... params) {
    imetnikPstmt.setString(1, params[0]);
    imetnikPstmt.setString(2, params[1]);
    imetnikPstmt.setString(3, params[2]);
    imetnikPstmt.setString(4, params[3]);
      
    imetnikPstmt.executeUpdate();
  }
}


Toliko zaenkrat. Zdaj pa malo treniraj sam :-). Vprašaj, če se ti kje zatakne.

EDIT: premaknil sem inicializacijo sql stavkov v initDB metodo

Zgodovina sprememb…

  • spremenil: kopernik ()

igor0203 ::

Najlepša hvala za pomoč!
Kar se tiče zapisov, sem mislil da kak
<Tr ... /Tr>
zapis ima še kakšno dodatno polje(npr.
<Nevem>bla</Nevem>
), spet drug recimo nima polja davcna itd.

Meni je šef pomagal takole oz. mi je dal takšno iztočnico:
public class ParseLine {
public static void Parse (String myLine) {
        String myWorkLine = null;
        String myTag = null;
        String myValue = null;
        if (myLine.substring(0,4).equals("<Tr ")) {
            myWorkLine = myLine.substring(4);
                myTag = myWorkLine.substring(0,myWorkLine.indexOf("="));
                myWorkLine = myWorkLine.substring(myWorkLine.indexOf("=")+2);
                myValue = myWorkLine.substring(0,myWorkLine.indexOf("\""));
                myWorkLine = myWorkLine.substring(myWorkLine.indexOf("\"")+2);
                System.out.println(myTag + " " + myValue);
            }
    else
        System.out.println("NAPAKA, vrstica se ne začne pravilno...");
        //System.exit(-1);
    }
}

kopernik ::

Ja, ok, potem očitno tvoj šef želi, da na roke parsaš xml. Narediti xml parser ni tako trivialno opravilo, te čaka nekaj dela.

igor0203 ::

Ja, se mi je kar zdelo da bo tole zalogaj. Hvala še enkrat za vso pomoč! ;)

igor0203 ::

Lahko še za malce pomoči prosim?
Ne morem nikakor napisati kodo, ki bi mi prebral vse stringe do Imetnik.
Torej ves ta del:
<Tr rn=\"999999999999999\" vr=\"T\" sSpre=\"S\" reg=\"P\" dSpre=\"2010-09-30\" dOdprt=\"2000-01-01\" iban=\"SI56\" eno=\"R\" vir=\"R\" maticnaPps=\"00000000\"


Oz. kako bi se potem lotil tega z ročnim parsanjem? Vidi se mi, da zadnje 4 leta nisem nič programiral. :|

Spura ::

Uporabi Castor knjiznjico za preslikavo XML v Objekt, in potem IBatis knjiznjico za preslikavo objekta v bazo.

XML parser imas ze implementiran v javi.

kopernik ::

Če bi jaz to delal, bi verjetno uporabil regularne izraze, čeprav za tako opravilo v splošnem niso pametna izbira zaradi proste oblike xml-a. Ampak tukaj poznaš strukturo in je lažje, pa še vse imaš zajeto po vrstici. Mogoče najdeš tukaj par namigov za začetek.

Genetic ::

Se posebej pa si pri kopernikovem linku poglej odgovore, zakaj ne uporabljati regexa, temvec XML parser ...

Spura ::

Regularni izrazi so katastrofalen predlog.
Resitev, ki sem jo predlagal je ena od boljsih za XML - Object - DB (so tudi drugi podobni technology stacki). Drugace se jst tocno s tem profesionalno ukvarjam.

kopernik ::

Beri še enkrat. On mora na roke parsat. Tvoj predlog je torej neuporaben. Ostane mu manipuliranje s stringi.

igor0203 ::

Hvala za nasvete. Tole se mi zaenkrat zdi kot Mount Everest. Ampak verjetno se bom čez nekaj časa smejal, kako lahko je bilo. :))

Spura ::

kopernik je izjavil:

Beri še enkrat. On mora na roke parsat. Tvoj predlog je torej neuporaben. Ostane mu manipuliranje s stringi.

Nikjer ni napisal te zahteve.

kopernik ::

Če mu je šef dal za iztočnico tisti snippet z substringi, potem sklepam, da je zahteva ročno parsanje (verjetno želi šef videti, kako stojijo temelji programiranja pri avtorju teme). Sicer bi si lahko dosti pomagal z xml parserjem, kot sem napisal že v začetku.

Spura ::

Potem bi pa bilo dobro, da pove ali gre za preizkus znanja ali za dejansko delovno nalogo.

igor0203 ::

Mislim, da oboje. Dal mi je to nalogo, ki jo moram naresti, obenem bi pa pomoje rad videl obseg mojega znanja.

Po končanem študiju moram opraviti strokovno prakso(FE smer Telekomunikacije). Programirat sem se učil v srednji šoli ter nekaj malega v 1. in 2. letniku na faxu, vendar tega nikoli nisem kaj preveč maral. Osnove sicer poznam, nisem pa vajen programerskega načina razmišljanja. Vem kako bi kak problem rešil, vendar tega ne znam spravit v kodo. V prošnji in na razgovoru sem omenil, da nisem že par let programiral in da poznam samo osnove, vendar je očitno to bilo dovolj.

Zgodovina sprememb…

  • spremenil: igor0203 ()

kopernik ::

Zakaj pa potem ne uporabiš xml parserja ? Boš imel delujočo rešitev dokaj hitro. Če bo pa šef naknadno želel kaj več, boš ustrezno nadgradil ali pa zamenjal določeno funkcionalnost. Verjemi mi, dosti bolje je nekaj delujočega spraviti na plano kot pa cincati več dni in nato ugotoviti, da ti v bistvu ne dela v redu niti branje xml-a niti shranjevanje v bazo.

igor0203 ::

Sej jutri bom tako tudi naredil pa kar bo, bo. Upam samo, da se ne bo kje zataknilo. :)

Spura ::

kopernik je izjavil:

Zakaj pa potem ne uporabiš xml parserja ? Boš imel delujočo rešitev dokaj hitro. Če bo pa šef naknadno želel kaj več, boš ustrezno nadgradil ali pa zamenjal določeno funkcionalnost.

Nadgrajevati tako kodo bo celo veselje ja. :)) Sploh logika za hendlanje opcijskih polj ter validacijo pravilnosti XML (da ne manjkajo obvezna polja) bo celo veselje. :))

igor0203 ::

Prosim, ne se kregat zaradi mene.
Sprobal bom tisto možnost, ki mi bo najenostavnejša za začetek. Tudi tale koda od šefa mi ni toliko nerazumljiva, le ne vem kako jo potem vrtet da prebere vse stringe. Bo potrebno še mal vaje. :)

Se pa zahvaljujem vsem za hitro pomoč in vsakršne pomoči sem vesel.

Spura ::

Naredi razrede, ki predstavljajo posamezne xml elemente in atribute in so sposobni sami sebe sparsat iz podstringov in znajo same sebe vstavit v prepared stavke. Tezko razlozit ta pattern, ce ne poznas OOP.

igor0203 ::

Šef je bil danes malo na obisku. Vmes sem naredil parsanje s pomočjo SAX parserja in sem mu to pokazal, pa mu ni bilo ravno preveč všeč.
Zagovarja iztočnico, ki mi jo je dal, ker naj bi z njo točno vedel kaj in kako se počne, s tistimi parserji pa je vse avtomatsko in ne veš kaj dela.
Zato moram nadaljevati s source kodo, ki sem jo zgoraj nalimal.

kopernik ::

No, potem boš pač moral parsati na roke. V osnovi boš moral manipulirati s stringi in to lahko delaš na različne načine. Jaz ostajam pri svojem predlogu zgoraj, sam pa se odloči, kako boš delal ...

igor0203 ::

Ma najraje bi pustil s SAX parserjem, ker mi je ratalo naredit delujoč program. Vem pa, da bo šef malce drugače gledal name, če bom naredil tako kot on želi, sploh ker so me šele vzeli.
Mi je pa ta njegov predlog težji, ker sem že izven prakse in nimam razvitega programerskega načina razvijanja. Kar se njemu zdi lahko, je zame težko. :D Pri meni je problem samo rešitev spravit v kodo.

igor0203 ::

Bi lahko prosil še za malce pomoči?

Kako bi z mojo kodo lahko izluščil ven recimo blabla ?
<PopolnoIme>blabla</PopolnoIme>

Zgodovina sprememb…

  • spremenil: igor0203 ()

igor0203 ::

Ok, evo malce sem že napredoval. Tole je moja koda, vendar imam še nekaj težav. Predvsem me muči tisti del po
<PopolnoIme>
, kjer neznam izluščiti ven podatkov. Bi mi lahko kdo malce pomagal?

package javaapplication2;

public class ParseLine{
public static void Parse (String myLine) throws Exception {
        String myWorkLine = null;
        String myTag = null;
        String myValue = null;
        int i=0;

        for (;i<myLine.length();i++) {
        if (myLine.substring(0,4).equals("<Tr ")) {
            myWorkLine = myLine.substring(4);
            while (!myLine.substring(0,i).equals("</Tr>")) {
                myTag = myWorkLine.substring(0,myWorkLine.indexOf("="));
                myWorkLine = myWorkLine.substring(myWorkLine.indexOf("=")+2);
                myValue = myWorkLine.substring(0,myWorkLine.indexOf("\""));
                myWorkLine = myWorkLine.substring(myWorkLine.indexOf("\"")+2);
                System.out.println(myTag + " " + myValue); 
            
                if (myWorkLine.substring(0,1).equals("<")) {
                    myWorkLine = myWorkLine.substring(1);
                    while (!myLine.substring(0, i).equals("<")) {
                        myTag = myWorkLine.substring(0,myWorkLine.indexOf(("=")));
                        myWorkLine = myWorkLine.substring(myWorkLine.indexOf("=")+2);
                        myValue=myWorkLine.substring(0,myWorkLine.indexOf(("\"")));
                        myWorkLine=myWorkLine.substring(myWorkLine.indexOf("\"")+2);
                        System.out.println(myTag + " " + myValue); 
                    
                        if (myWorkLine.substring(0,1).equals("<")) {
                            myWorkLine = myWorkLine.substring(1);
                            while (!myLine.substring(0,i).equals(">")) {
                                myTag = myWorkLine.substring(0,myWorkLine.indexOf("<"));
                                myWorkLine = myWorkLine.substring(myWorkLine.indexOf("<")+1);
                                myValue = myWorkLine.substring(0,myWorkLine.indexOf(">"));
                                myWorkLine = myWorkLine.substring(myWorkLine.indexOf(">")+1);
                                System.out.println(myTag + " " + myValue);
                                
                            } //3. while zanka                                                  
                        }//3. if stavek
                    
                    } //2. while zanka
                } //2. if stavek

            } //1. while zanka
        } else //if zanka
        System.out.println("NAPAKA, vrstica se ne začne pravilno..."); 

     } //for zanka
   } //Parse zanka
} //ParseLine zanka



Tole ja pa output, ko poženem:

rn 191605009185948
vr T
sSpre S
reg P
dSpre 2010-01-01
dOdprt 2010-01-01
iban SI56
vir R
maticnaPps 0000007000
Imetnik davcna 00000255
matSub 0000077000
drz 705
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
PopolnoIme>BLA BLA /PopolnoIme
KratkoIme
BLA BLA /KratkoIme
Naslov sifTipNaslova="01" sifObcina="000" sifPosta="000" sifUlica="0000" sifNaselje="001" stHisna="060" dodatek="B" sifHsmid="123456789"
Obcina
ŠEMPETER-VRTOJBA /Obcina
Posta
ŠEMPETER PRI GORICI /Posta
Ulica
CESTA PREKOMORSKIH BRIGAD /Ulica
Naselje
ŠEMPETER PRI GORICI /Naselje
/Naslov
/Imetnik
/Tr

Zgodovina sprememb…

  • spremenil: igor0203 ()

LeQuack ::

Tole parsanje na roko je zlo togo, ravno zato so se razvili XML parserji. Šef bi ti dal lahko kako bolj uporabno nalogo kot odkrivanje tople vode.
Recimo že prvi pogoj ne bi ustrezal, če bi se vrstica začela z presledkom, tab-om ali nekim drugim whitespaceom. Pri takih stvareh je treba biti zelo pazljiv.
if (myLine.substring(0,4).equals("<Tr ")) {
Quack !

igor0203 ::

Hja ugovarjat mu ne morem, od njega je odvisna moja praksa. :)

igor0203 ::

Malo sem že napredoval s pomočjo kolega, ki mi je dal par nasvetov. In ratalo je tole:

package javaapplication2;

public class ParseLine{
public static void Parse (String myLine) throws Exception {
//        String myWorkLine = null;
        String myTag = null;
        String myValue = null;
        String Tr = "<Tr";
//        String ETr = "</Tr>";
        String PI = "<PopolnoIme>";
        String EPI = "</PopolnoIme>";
        String KI = "<KratkoIme>";
        String EKI = "</KratkoIme>";
        String Naslov = "<Naslov>";
        String ENaslov = "</Naslov>";
        String PIR = "<PopolnoImeRacuna>";
        String EPIR = "</PopolnoImeRacuna>";
        String Imetnik = "<Imetnik>";
//        String EImetnik = "</Imetnik>";
        String NazivPP = "<NazivPp>";
        String ENazivPP = "<NazivPP>";
        String Posta = "<Posta>";
        String EPosta = "</Posta>";
        String Ulica = "<Ulica>";
        String EUlica = "</Ulica>";
        String Obcina = "<Obcina>";
        String EObcina = "</Obcina>";
        String KIR = "<KratkoImeRacuna>";
        String EKIR = "</KratkoImeRacuna>";
        String Naselje = "<Naselje>";
        String ENaselje = "</Naselje>";

        int i=0;

        //while (!myLine.contains(ETr)) {
        if (myLine.substring(0,4).equals("<Tr ")) {

            if (myLine.contains("=")) {
                while (!myLine.equals("<")) {
                myTag = myLine.substring(0,myLine.indexOf("="));
                myLine = myLine.substring(myLine.indexOf("=")+2);
                myValue = myLine.substring(0,myLine.indexOf("\""));
                myLine = myLine.substring(myLine.indexOf("\"")+2);
                System.out.println(myTag + " " + myValue);
                }
            }
            
            if (myLine.contains(Imetnik)) {
                while (!myLine.equals("<")) {
                myTag = myLine.substring(0,myLine.indexOf("="));
                myLine = myLine.substring(myLine.indexOf("=")+2);
                myValue = myLine.substring(0,myLine.indexOf("\""));
                myLine = myLine.substring(myLine.indexOf("\"")+2);
                System.out.println(myTag + " " + myValue);
                }
            }
                        
            if (myLine.contains(PI)) {
                myValue = myLine.substring(myLine.indexOf(PI)+12,myLine.indexOf(EPI));
                System.out.println(PI + " " + myValue);
            }

            if (myLine.contains(KI)) {
                myValue = myLine.substring(myLine.indexOf(KI)+11,myLine.indexOf(EKI));
                System.out.println(KI + " " + myValue);
            }

            if (myLine.contains(NazivPP)) {
                myValue = myLine.substring(myLine.indexOf(NazivPP)+9,myLine.indexOf(ENazivPP));
                System.out.println(NazivPP + " " + myValue);
            }

            if (myLine.contains(Naslov)) {
                while (!myLine.equals("<")) {
                myTag = myLine.substring(0,myLine.indexOf("="));
                myLine = myLine.substring(myLine.indexOf("=")+2);
                myValue = myLine.substring(0,myLine.indexOf("\""));
                myLine = myLine.substring(myLine.indexOf("\"")+2);
                System.out.println(myTag + " " + myValue);
                }
            }

            if (myLine.contains(PIR)) {
                myValue = myLine.substring(myLine.indexOf(PIR)+18,myLine.indexOf(EPIR));
                System.out.println(PIR + " " + myValue);
            }

            if (myLine.contains(KIR)) {
                myValue = myLine.substring(myLine.indexOf(KIR)+17,myLine.indexOf(EKIR));
                System.out.println(KIR + " " + myValue);
            }

            if (myLine.contains(Ulica)) {
                myValue = myLine.substring(myLine.indexOf(Ulica)+7,myLine.indexOf(EUlica));
                System.out.println(Ulica + " " + myValue);
            }

            if (myLine.contains(Obcina)) {
                myValue = myLine.substring(myLine.indexOf(Obcina)+8,myLine.indexOf(EObcina));
                System.out.println(Obcina + " " + myValue);
            }

            if (myLine.contains(Posta)) {
                myValue = myLine.substring(myLine.indexOf(Posta)+7,myLine.indexOf(EPosta));
                System.out.println(Posta + " " + myValue);
            }

            if (myLine.contains(Naselje)) {
                myValue = myLine.substring(myLine.indexOf(Naselje)+9,myLine.indexOf(ENaselje));
                System.out.println(Naselje + " " + myValue);
            }
                

    } else //if
    System.out.println("ERROR! Line doesn't start with <Tr ");

  } //Parse
} //ParseLine 


Sedaj me samo še matra, kako vrtet while zanke, da se ustavijo ko pridejo do znaka
<
, in potem skoči na nov if stavek. Ima kdo kakšno idejo?

Lp,
Igor

??

Noben? :8)

Noben? :8)

Res noben ne bi vedel? :8)

Zgodovina sprememb…

  • spremenil: igor0203 ()

igor0203 ::

Tole je en del kode:

        if (myLine.substring(0,4).equals("<Tr ")) {

            if (myLine.contains(Tr)) {
                System.out.println("Tr: ");
                myLine = myLine.substring(myLine.indexOf(Tr)+4);
                while (!myLine.substring(0,1).equals(">")) {                   
                    myTag = myLine.substring(0,myLine.indexOf("="));
                    myLine = myLine.substring(myLine.indexOf("=")+2);
                    myValue = myLine.substring(0,myLine.indexOf("\""));
                    myLine = myLine.substring(myLine.indexOf("\"")+2);
                    System.out.println(myTag + " " + myValue + " ");
                   // System.out.println(myLine);
                    if (myLine.substring(0,20).indexOf(">") > 0)
                        break;
                }
            }


Zanima me, zakaj mi recimo, ko vnesem poljubno vrstico iz XML datoteke, enkrat dela pravilno, enkrat pa ne?

Recimo, če vnesem tole:
<Tr rn=\"044800110936273\" vr=\"T\" sSpre=\"S\" reg=\"P\" dSpre=\"2010-10-07\" dOdprt=\"2002-07-03\" iban=\"SI56\" vir=\"R\" maticnaPps=\"0000\">


mi izpiše takole:

Tr: 
rn 044800110936273 
vr T 
sSpre S 
reg P 
dSpre 2010-10-07 
dOdprt 2002-07-03 
iban SI56 
vir R 
maticnaPps 0000


če pa vnesem recimo tole vrstico:

<Tr rn=\"051008012231013\" vr=\"F\" sSpre=\"Z\" reg=\"P\" dSpre=\"2010-10-07\" dOdprt=\"2006-09-08\" dZaprt=\"2010-10-07\" iban=\"SI56\" vir=\"B\" maticnaPps=\"000\"><Imetnik davcna=\"000\" matSub=\"000\" drz=\"705\">


se mi pa ne ustavi pri > znaku in mi potem izpiše takole:

Tr: 
rn 051008010084985 
vr T 
sSpre S 
reg P 
dSpre 2010-10-07 
dOdprt 2001-12-11 
iban SI56 
eno R 
vir B 
maticnaPps 000 
<Imetnik davcna 000 
matSub 000 


Če povečam recimo myLine.substring(0,30) mi pa dela normalno, vendar mi potem pri prvem primeru ne izpiše vseh atributov?

igor0203 ::

Končno mi je ratalo. Tole je, kar je nastalo. :) Sedaj pa samo še vstaviti vrednosti iz XML datoteke v mySQL tabelo.

package javaapplication2;

import java.io.*;

public class ParseLine{

public static void Parse () throws Exception {

//initialization

        String myTag = null;
        String myValue = null;
        String Tr = "<Tr ";
        String PI = "<PopolnoIme>";
        String EPI = "</PopolnoIme>";
        String KI = "<KratkoIme>";
        String EKI = "</KratkoIme>";
        String Naslov = "<Naslov ";
        String PIR = "<PopolnoImeRacuna>";
        String EPIR = "</PopolnoImeRacuna>";
        String Imetnik = "<Imetnik ";
        String NazivPp = "<NazivPp>";
        String ENazivPp = "</NazivPp>";
        String Posta = "<Posta>";
        String EPosta = "</Posta>";
        String Ulica = "<Ulica>";
        String EUlica = "</Ulica>";
        String Obcina = "<Obcina>";
        String EObcina = "</Obcina>";
        String KIR = "<KratkoImeRacuna>";
        String EKIR = "</KratkoImeRacuna>";
        String Naselje = "<Naselje>";
        String ENaselje = "</Naselje>";
        String myWorkLine;
        
//body
        try {

            InputStreamReader input = new InputStreamReader(System.in);
            BufferedReader tipka = new BufferedReader(input);
            System.out.print("Prosimo vnesite ime XML datoteke brez končnice: ");
            String imeDatoteke=tipka.readLine();

            FileInputStream fstream = new FileInputStream("c:\\test\\" + imeDatoteke + ".xml");
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            System.out.println();
        
        while ((myWorkLine = br.readLine()) != null) {
        
        if (myWorkLine.substring(0,4).equals("<Tr ")) {

            if (myWorkLine.contains(Tr)) {
                System.out.println("<Tr>");
                myWorkLine = myWorkLine.substring(myWorkLine.indexOf(Tr)+4);
                while (!myWorkLine.substring(0,1).equals("<")) {
                    myTag = myWorkLine.substring(0,myWorkLine.indexOf("="));
                    myWorkLine = myWorkLine.substring(myWorkLine.indexOf("=")+2);
                    myValue = myWorkLine.substring(0,myWorkLine.indexOf("\""));
                    myWorkLine = myWorkLine.substring(myWorkLine.indexOf("\"")+2);
                    System.out.println(myTag + " " + myValue + " ");
                        if (myWorkLine.substring(0,myWorkLine.indexOf("\">")).indexOf(">") > 0)
                             break;
                }
            }
            
            if (myWorkLine.contains(NazivPp)) {
                myValue = myWorkLine.substring(myWorkLine.indexOf(NazivPp)+9,myWorkLine.indexOf(ENazivPp));
                System.out.println("NazivPp: " + myValue);
            } 

            if (myWorkLine.contains(PIR)) {
                myValue = myWorkLine.substring(myWorkLine.indexOf(PIR)+18,myWorkLine.indexOf(EPIR));
                System.out.println("PopolnoImeRacuna: " + myValue);
            } 

            if (myWorkLine.contains(KIR)) {
                myValue = myWorkLine.substring(myWorkLine.indexOf(KIR)+17,myWorkLine.indexOf(EKIR));
                System.out.println("KratkoImeRacuna: " + myValue);
            } 
                        
            if (myWorkLine.contains(Imetnik)) {
                System.out.println("<Imetnik> ");
                myWorkLine = myWorkLine.substring(myWorkLine.indexOf(Imetnik)+9);
                while (!myWorkLine.substring(0,1).equals("<")) {
                    myTag = myWorkLine.substring(0,myWorkLine.indexOf("="));
                    myWorkLine = myWorkLine.substring(myWorkLine.indexOf("=")+2);
                    myValue = myWorkLine.substring(0,myWorkLine.indexOf("\""));
                    myWorkLine = myWorkLine.substring(myWorkLine.indexOf("\"")+2);
                    System.out.println(myTag + " " + myValue);
                        if (myWorkLine.substring(0,1).indexOf(">") > 0)
                            break;
                    }
            } 
                        
            if (myWorkLine.contains(PI)) {
                myValue = myWorkLine.substring(myWorkLine.indexOf(PI)+12,myWorkLine.indexOf(EPI));
                System.out.println("PopolnoIme: " + myValue);
            } 

            if (myWorkLine.contains(KI)) {
                myValue = myWorkLine.substring(myWorkLine.indexOf(KI)+11,myWorkLine.indexOf(EKI));
                System.out.println("KratkoIme: " + myValue);
            } 

            if (myWorkLine.contains(Naslov)) {
                System.out.println("<Naslov>");
                myWorkLine = myWorkLine.substring(myWorkLine.indexOf(Naslov)+8);
                while (!myWorkLine.substring(0,1).equals("<")) {
                    myTag = myWorkLine.substring(0,myWorkLine.indexOf("="));
                    myWorkLine = myWorkLine.substring(myWorkLine.indexOf("=")+2);
                    myValue = myWorkLine.substring(0,myWorkLine.indexOf("\""));
                    myWorkLine = myWorkLine.substring(myWorkLine.indexOf("\"")+2);
                    System.out.println(myTag + " " + myValue);
                        if (myWorkLine.substring(0,1).indexOf(">") > 0)
                            break;
                }
            } 

            if (myWorkLine.contains(Ulica)) {
                myValue = myWorkLine.substring(myWorkLine.indexOf(Ulica)+7,myWorkLine.indexOf(EUlica));
                System.out.println("Ulica: " + myValue);
            } 

            if (myWorkLine.contains(Obcina)) {
                myValue = myWorkLine.substring(myWorkLine.indexOf(Obcina)+8,myWorkLine.indexOf(EObcina));
                System.out.println("Obcina: " + myValue);
            } 

            if (myWorkLine.contains(Posta)) {
                myValue = myWorkLine.substring(myWorkLine.indexOf(Posta)+7,myWorkLine.indexOf(EPosta));
                System.out.println("Posta: " + myValue);
            } 

            if (myWorkLine.contains(Naselje)) {
                myValue = myWorkLine.substring(myWorkLine.indexOf(Naselje)+9,myWorkLine.indexOf(ENaselje));
                System.out.println("Naselje: " + myValue);
            } 
        
    } //if
            
        } //while


    }   catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        
        }
  } //Parse
} //ParseLine 

igor0203 ::

Kako bi najlažje implementiral, da mi vrednosti vpisuje v mySQL tabelo? Probal sem z insertRow, pa mi javi napako. UpdateRow pa prav tako ne dela.

Končano! Hvala vsem za pomoč! :)

Zgodovina sprememb…

  • spremenil: igor0203 ()

igor0203 ::

Da ne odpiram nove teme, ker je še zmeraj vezano na ta program.
Sedaj sem moral iz XML datoteke razbrati ven samo določene podatke in jih vpisati v mySQL tabelo. Naredil sem dve tabeli, eno TR_AJPES_TR, kamor vpisujem podatke iz XML datoteke ter TR_AJPES_TR_LOG, kamor vpisujem datum uvoza ter ime datoteke.
V TR_AJPES_TR tabeli sem naredil foreign key, ki je vezan na primary key v TR_AJPES_TR_LOG, s katerim ubistvu potem označujem vse podatke, ki so bili uvoženi iz ene datoteke.

Sedaj pa ne vem na kak način ta foreign key vpisat v TR_AJPES_TR tabelo? Se to stori avtomatsko ali moram razbrati foreign key in ga s kakšno updateInt() funkcijo vpisati?

Spodaj prilagam kodo,da bo malce bolj razumljivo.

package javaapplication2;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
import java.io.*;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class ParseLine{

public static void Parse() throws Exception {

//initialization

        String myTag = null;
        String myValue = null;
        String Tr = "<Tr ";
        String Imetnik = "<Imetnik ";
        String myWorkLine = null;
        String new_table_name=null;
        String user = "user";
        String pass = "pass";
        int i=0;

//DATE
        DateFormat dateF = new SimpleDateFormat("dd.MM.yyyy");
        Date date = new Date();
//DATE

//READ FILE
        InputStreamReader input = new InputStreamReader(System.in);
        BufferedReader Key = new BufferedReader(input);
        System.out.print("Prosimo vnesite ime XML datoteke(brez končnice .xml): ");
        String fileName=Key.readLine();
        new_table_name=fileName;
        FileInputStream fstream = new FileInputStream("c:\\test\\" + fileName + ".xml");
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        System.out.println();
//READ FILE

//SELECT INIT
        String URL = "jdbc:mysql://192.168.1.128:3306";
        Connection con = (Connection) DriverManager.getConnection(URL,user,pass);
        Statement stmt = (Statement) con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
        Statement stmt1 = (Statement) con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
        String mySQL_log = ("CREATE TABLE IF NOT EXISTS dbtest.T_AJPES_TR_LOG"
            + "(ID_LOG INT PRIMARY KEY AUTO_INCREMENT, Date_import VARCHAR(45),"
            + "File_import VARCHAR(75)) TYPE = INNODB");
        String mySQL_new_table = ("CREATE TABLE IF NOT EXISTS dbtest.T_AJPES_TR "
            + "(row_count INT PRIMARY KEY AUTO_INCREMENT,"
            + "rn CHAR(15),sSpre CHAR(5),reg CHAR(5),eno VARCHAR(10),davcna VARCHAR(15),Ime VARCHAR(75),"
            + "Priimek VARCHAR(75),ID_LOG INT,"
            + "FOREIGN KEY(ID_LOG) references T_AJPES_TR_LOG(ID_LOG) ON DELETE CASCADE ON UPDATE CASCADE) TYPE = INNODB");

        stmt1.executeUpdate(mySQL_log);
        ResultSet uprs1 = stmt1.executeQuery("SELECT * FROM dbtest.T_AJPES_TR_LOG");
        stmt.executeUpdate(mySQL_new_table);
        ResultSet uprs = stmt.executeQuery("SELECT * FROM dbtest.T_AJPES_TR");
//SELECT INIT

//body

    uprs1.afterLast();
    uprs1.moveToInsertRow();
    uprs1.updateString("Date_import",dateF.format(date));
    uprs1.updateString("File_import",fileName);
    uprs1.insertRow();

//WHILE READ UNTIL END FILE
    while ((myWorkLine = br.readLine()) != null) {

//CHECK IF CONTAINS TR
        if (myWorkLine.substring(0,4).equals(Tr)) {

                uprs.afterLast();
                uprs.moveToInsertRow();

            if (myWorkLine.contains(Tr)) {
                myWorkLine = myWorkLine.substring(myWorkLine.indexOf(Tr)+4);
                while (!myWorkLine.substring(0,1).equals("<")) {
                    myTag = myWorkLine.substring(0,myWorkLine.indexOf("="));
                    myWorkLine = myWorkLine.substring(myWorkLine.indexOf("=")+2);
                    myValue = myWorkLine.substring(0,myWorkLine.indexOf("\""));
                    myWorkLine = myWorkLine.substring(myWorkLine.indexOf("\"")+2);
                    if (myTag.equals("rn")) {                   
                        uprs.updateString("rn",myValue);
                    }
                        if (myTag.equals("sSpre")) {
                            uprs.updateString("sSpre",myValue);
                        }
                            if (myTag.equals("reg")) {
                                uprs.updateString("reg",myValue);
                            }
                            if (myTag.equals("eno")) {
                                uprs.updateString("eno",myValue);
                            }
                } //WHILE Tr
            } //IF Tr

            if (myWorkLine.contains(Imetnik)) {
                    myWorkLine = myWorkLine.substring(myWorkLine.indexOf(Imetnik)+9);
                while (!myWorkLine.substring(0,1).equals("<")) {
                    myTag = myWorkLine.substring(0,myWorkLine.indexOf("="));
                    myWorkLine = myWorkLine.substring(myWorkLine.indexOf("=")+2);
                    myValue = myWorkLine.substring(0,myWorkLine.indexOf("\""));
                    myWorkLine = myWorkLine.substring(myWorkLine.indexOf("\"")+2);
                    if (myTag.equals("davcna")) {                    
                        uprs.updateString("davcna",myValue);
                    }
                        if (myTag.equals("Ime")) {
                            uprs.updateString("Ime",myValue);
                        }
                            if (myTag.equals("Priimek")) {
                                uprs.updateString("Priimek",myValue);
                            }
                } //WHILE Imetnik
            } //IF Tr
            
            uprs.insertRow();
           
        } //CHECK IF CONTAINS TR

    } //WHILE READ UNTIL END FILE
                
            uprs.close();
            uprs1.close();
            stmt.close();
            con.close();

    } //Parse

} //ParseLine


igor0203 ::

Ne bi rad odpiral nove teme, pa bom kar tule vprašal.

Kako v tabeli preveriti, če zapis z enakim imenom že obstaja? Konkretno, v tabelo T_AJPES_TR_LOG zapisujem ID, datum vnosa ter ime datoteke iz katere so uvoženi podatki. Sedaj bi pa rad preveril, če je bila ta datoteka že uvožena.

Probal sem že določiti File_import kot UNIQUE KEY, vendar mi potem pri insertRow() vrže "duplicate error..." .
V tem spodnjem primeru mi pa nikoli ne vpiše v tabelo.

Del kode, kjer to preverjam:

//DB INIT
        String URL = "jdbc:mysql://192.168.1.128:3306";
        Connection con = (Connection) DriverManager.getConnection(URL,user,pass);
        Statement stmt = (Statement) con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
        Statement stmt1 = (Statement) con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
        String mySQL_log = ("CREATE TABLE IF NOT EXISTS dbtest.T_AJPES_TR_LOG"
            + "(ID INT unsigned PRIMARY KEY AUTO_INCREMENT, Date_import VARCHAR(45),"
            + "File_import VARCHAR(75),CONSTRAINT UNIQUE KEY(File_import)) ENGINE = INNODB");
        String mySQL_new_table = ("CREATE TABLE IF NOT EXISTS dbtest.T_AJPES_TR "
            + "(row_count INT PRIMARY KEY AUTO_INCREMENT,"
            + "rn CHAR(15),sSpre CHAR(5),reg CHAR(5),eno VARCHAR(10),davcna VARCHAR(15),Ime VARCHAR(75),"
            + "Priimek VARCHAR(75),ID_LOG INT unsigned,"
            + "CONSTRAINT FOREIGN KEY(ID_LOG) references T_AJPES_TR_LOG(ID) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = INNODB");

            stmt1.executeUpdate(mySQL_log);
            ResultSet uprs1 = stmt1.executeQuery("SELECT * FROM dbtest.T_AJPES_TR_LOG");
            stmt.executeUpdate(mySQL_new_table);
            ResultSet uprs = stmt.executeQuery("SELECT * FROM dbtest.T_AJPES_TR");
//SELECT INIT

//READ FILE        
        File folder = new File(readFolder);
        String[] fileName = folder.list();

        for (;k<fileName.length;k++) {
            name = fileName[k];

            if (name.contains(".xml")) {
                FileInputStream fstream = new FileInputStream(readFolder + name);
                DataInputStream in = new DataInputStream(fstream);
                BufferedReader br = new BufferedReader(new InputStreamReader(in));
//READ FILE
            
//                uprs1 = stmt1.executeQuery("SELECT * FROM dbtest.T_AJPES_TR_LOG WHERE File_import = " + name);
                
                    uprs1.afterLast();
                    uprs1.moveToInsertRow();
                    uprs1.updateString("Date_import",dateF.format(date));
                    uprs1.updateString("File_import",name);
                    file_exists = uprs1.getString("File_import");
                    
                    if (!name.equals(file_exists)) {
                    uprs1.insertRow();
                    i=0;


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Java]kompailiranje iz cmd

Oddelek: Programiranje
91179 (903) ragezor
»

android črta

Oddelek: Programiranje
412270 (1541) g333kk
»

[android] vstavljanje slike

Oddelek: Programiranje
71143 (1040) messi
»

[android] crash

Oddelek: Programiranje
61261 (1070) messi
»

[Java] Evidenca delovnega časa - Java v navezi z Accessom

Oddelek: Programiranje
393183 (2403) c0dehunter

Več podobnih tem