Forum » Programiranje » 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
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.
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).
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.
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...
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).
Toliko zaenkrat. Zdaj pa malo treniraj sam :-). Vprašaj, če se ti kje zatakne.
EDIT: premaknil sem inicializacijo sql stavkov v initDB metodo
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
Meni je šef pomagal takole oz. mi je dal takšno iztočnico:
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 ::
Lahko še za malce pomoči prosim?
Ne morem nikakor napisati kodo, ki bi mi prebral vse stringe do Imetnik.
Torej ves ta del:
Oz. kako bi se potem lotil tega z ročnim parsanjem? Vidi se mi, da zadnje 4 leta nisem nič programiral.
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.
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.
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 ::
Č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.
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.
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.
Spura ::
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.
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.
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.
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 ?
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
Tole ja pa output, ko poženem:
<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.
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 ::
Malo sem že napredoval s pomočjo kolega, ki mi je dal par nasvetov. In ratalo je tole:
Sedaj me samo še matra, kako vrtet while zanke, da se ustavijo ko pridejo do znaka
Lp,
Igor
??
Noben?
Noben?
Res noben ne bi vedel?
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?
Noben?
Res noben ne bi vedel?
Zgodovina sprememb…
- spremenil: igor0203 ()
igor0203 ::
Tole je en del kode:
Zanima me, zakaj mi recimo, ko vnesem poljubno vrstico iz XML datoteke, enkrat dela pravilno, enkrat pa ne?
Recimo, če vnesem tole:
mi izpiše takole:
če pa vnesem recimo tole vrstico:
se mi pa ne ustavi pri > znaku in mi potem izpiše takole:
Če povečam recimo myLine.substring(0,30) mi pa dela normalno, vendar mi potem pri prvem primeru ne izpiše vseh atributov?
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č! :)
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.
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:
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Java]kompailiranje iz cmdOddelek: Programiranje | 1301 (1025) | ragezor |
» | android črtaOddelek: Programiranje | 2399 (1670) | g333kk |
» | [android] vstavljanje slikeOddelek: Programiranje | 1240 (1137) | messi |
» | [android] crashOddelek: Programiranje | 1338 (1147) | messi |
» | [Java] Evidenca delovnega časa - Java v navezi z AccessomOddelek: Programiranje | 3283 (2503) | c0dehunter |