Pereiti prie turinio

XML parsing JAVA, array visualization 2D kreivėj, KAIP?


Rekomenduojami pranešimai

Sveiki, esu viso labo tik pradedantis Java programuotojas, ir reikalinga sukurti GUI. Principas, kad reikia nuskaityti masyvą iš XML failo, bei jį atvaizduoti grafiškai. Tikriausiai trūksta man kažkokių žinių, arba nerandu konkrečių tinkančių mano atvejui pavyzdžių.

Turiu XML failą:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
   <tx_positions>[0 0 0 433.012701892219 433.012701892219 433.012701892219 3.06161699786838e-14 3.06161699786838e-14 3.06161699786838e-14 -433.012701892219 -433.012701892219 -433.012701892219 -433.012701892219 -433.012701892219 -433.012701892219 -9.18485099360515e-14 -9.18485099360515e-14 -9.18485099360515e-14 433.012701892219 433.012701892219 433.012701892219 42.3647765342118 99.7547893898332 11.2054259129501 49.2097314447929 -127.395273171483 -248.14891620048 712.525742586002 523.490468707607 542.173039965725 442.58669499568 235.419084544849 360.314388274723 227.845316373637 84.7591038007133 -106.801551739991 -67.6808496619261 -122.941657556154 -86.6722958319251 -313.485033878617 -278.312734785683 -428.71458546479 -344.276480250725 -673.954191378484 -512.110270350428 -252.974043577397 -216.234293676421 -453.770987334676 -303.256329636033 -554.721136705585 -603.868890016823 165.607003029405 0.82859204205086 7.81100131109548 123.967851251004 -87.521058038606 -269.622525850991 440.579162057008 588.559831914912 531.748515779712 324.520883050137 306.293041352806 211.591447155592;0 0 0 250 250 250 500 500 500 250 250 250 -250 -250 -250 -500 -500 -500 -250 -250 -250 -187.91326287411 -117.744175256443 228.406500132253 139.101600789042 -183.96617030504 16.9148562251789 230.774205223105 292.129717432013 390.369208335017 480.625704650158 278.208557299124 93.4813306881351 399.297842058635 345.925112862116 726.278510979964 663.857719760113 446.435178967761 284.111476275942 138.059756508968 221.26488173993 445.518346833998 382.558945661844 115.921953248502 294.43536373527 -383.700552674053 -410.024036078325 -28.8528340605174 -100.02928884002 -420.991006585657 -198.873493145915 -544.285028793092 -641.118366075968 -380.910079999167 -269.701027494359 -498.178982465844 -498.707937179585 -417.929644132318 -315.726007104745 -156.938773662954 -54.7469095139043 -233.122442439795 -230.964934793741;32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5]</tx_positions>
</ROOT>

čia yra trimatis masyvas 3x60. Pirmos 60 reikšmių x vertės, antros 60- y, ir sekančios 60- z. Kad būtų paprasčiau ir nesivelti į 3D vaizdavimą, noriu nuskaityti tik x,y vertes ir jas atvaizduoti dvimačiame grafike, kreive ar taškais.

 

Trūkstą minčių kaip ištraukti tas vertes iš XML. Kokie yra parsing JAVA metodai ir kuris man tinkamas tokiam duomenų srautui?

Atvaizduot paskui tą masyvą manau tiktų čia parodytas pavyzdys, realizuotas JavaFX kuris puikiai tinkamas GUI, kolkas nieko sudėtingo tam nereiktų:

http://docs.oracle.com/javafx/2/charts/line-chart.htm

 

public class AdvancedLineChartSample extends Application {

   private void init(Stage primaryStage) {
       Group root = new Group();
       primaryStage.setScene(new Scene(root));
       root.getChildren().add(createChart());
   }

   protected LineChart<Number, Number> createChart() {
       final NumberAxis xAxis = new NumberAxis();
       final NumberAxis yAxis = new NumberAxis();
       final LineChart<Number,Number> lc = new LineChart<Number,Number>(xAxis,yAxis);
       // setup chart
       lc.setTitle("Basic LineChart");
       xAxis.setLabel("X Axis");
       yAxis.setLabel("Y Axis");
       // add starting data
       XYChart.Series<Number,Number> series = new XYChart.Series<Number,Number>();
       series.setName("Data Series 1");
       series.getData().add(new XYChart.Data<Number,Number>(20d, 50d));
       series.getData().add(new XYChart.Data<Number,Number>(40d, 80d));
       series.getData().add(new XYChart.Data<Number,Number>(50d, 90d));
       series.getData().add(new XYChart.Data<Number,Number>(70d, 30d));
       series.getData().add(new XYChart.Data<Number,Number>(170d, 122d));
       lc.getData().add(series);
       return lc;
   }

   @Override public void start(Stage primaryStage) throws Exception {
       init(primaryStage);
       primaryStage.show();
   }
   public static void main(String[] args) { launch(args); }
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Būtinai turi skaityti kaip xml? Nes kaip paprastą failiuką, tai labai lengvai būtų. Jei ne, tai siūlyčiau biški xml pasmulkinti: x reikšmėms <tx_positions></tx_positions>, y reikšmėms <ty_positions></ty_positions> ir z reikšmėms <tz_positions></tz_positions>. Tuomet paprastas xml skaitymas gaunasi ir tiek. Gausi tris stringus, kuriuose bus visos reikšmės, tuomet kapoji. Berods kažkas tokio yra String [] xArray = x.split(); taip gausi masyvą su x reikšmėmis. Pasicastinsi į double ir viskas ;)

Redagavo Plutonium
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Taip tik xml visais atvejais turiu. Hardware tokį sugeneruoja, todėl jau pačiam apdirbti reik tuos duomenis. Nepatogiai sukalą į tą stringą tai ir ieškau būdų. Bandysiu googlinti. Gal kaip alternatyva yra greitas būdas konvertuoti į kitą formatą ir ten nuskaityti patogiau?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aš kaip suprantu, tai turėtų Tau nuskaityti visą kas yra tarp <tx_positions></tx_positions> į string'ą. Taip? Ar kaip?

 

Taip, viską reik iš to lauko nuskaityti, ir tada apdoroti, kitaip sakant pačiam kažkaip apdirbti ir atskirti x, y, z koordinates.

Tada turint skirtingus x, y, z masyvus jau galiu duomenis lengviau atvaizduot GUI.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pasinaudodamas http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/ išskaitai savo duomenis į vieną stringą. Tuomet su split() sukonstruoji masyvą reikšmių. Vėliau emi pirmus kažkiek, ir jie bus x, kitus kažkiek bus y, ir likusieji bus y

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Geri patarimai, einu link tinkslo, bet šiandien kažkas nepavyksta su pasivertimu stringo į masyvą.

Tikriausiai susipainiojau.

 

Kaip pvz: nuskaitau xml, nuimtu skliautus, sudedu kablelius ir tada splitinu.

Bet dar negaunu trijų skirtingų skaičių masyvų, vis kažkaip eilutė stovi ir blogai vaizduoja.

 

String myArrayList = "[1.0 2.5 3.4;4.5 5.2 6.4;7.7 8.8 9.9]";
String input = myArrayList.replace(" ", ",").replace("[", "").replace("]", "");

String[] x = input.split(";");
String[][] result = new String[x.length][];
for (int i = 0; i<x.length; i++) {
   result[i] = x[i].split(",");
   System.out.println(result);
}

 

Kaip suprantu čia turėtų išeiti:

1.0,2.5,3.4

4.5,5.2,6.4

7.7,8.8,9.9

 

bet gaunu štai tai:

[[Ljava.lang.String;@140de537

[[Ljava.lang.String;@140de537

[[Ljava.lang.String;@140de537

 

Tai va dar kažko nemoku su konvertavimu. Gal padėti gali?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kaip suprantu čia turėtų išeiti:

1.0,2.5,3.4

4.5,5.2,6.4

7.7,8.8,9.9

 

bet gaunu štai tai:

[[Ljava.lang.String;@140de537

[[Ljava.lang.String;@140de537

[[Ljava.lang.String;@140de537

 

Tai va dar kažko nemoku su konvertavimu. Gal padėti gali?

 

Java taip paprastai masyvų nepaverčia į tekstą, reikia pasinaudoti %29"]Arrays.toString()

System.out.println(Arrays.toString(result));

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Viskas neblogai, atrodo spausdina ir tt, bet kai reikia vaizduoti tada problemos.

Sukuriu dvimatį masyvą, ciklas cikle ir suformuoju double tipą.

Tačiau nemoku to double tipo atskirai sukištį į tris kintamus,

tarkim datax[], data[y], data[z], kur vėliau laisvai šiuos kintamuosius pasiimčiau kitame faile... trūksta šiek tiek pagrindų tai pasimečiau.

 

Dvimatį double masyvą darau taip:

 

String myArrayList = "[1.0 2.5 3.4;4.5 5.2 6.4;7.7 4.8 9.5]";
String input = myArrayList.toString().replace(" ", ", ").replace("[", "").replace("]", "");
String[] x = input.split(";");
Double[][] result = new Double[x.length][];
for (int i = 0; i < x.length; i++) {
   String[] row = x[i].split(",");
   result[i] = new Double[row.length];
   for(int j=0; j < row.length; j++) {
   result[i][j] = Double.parseDouble(row[j]);
   System.out.println(result[0][j]);    
   }
}

Gaunu double tipą taip:

1.0

2.5

3.4

1.0

2.5

3.4

1.0

2.5

3.4

 

Gal aš jau čia visai grybauju ir patarsite ką nors? Dėkoju!

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Gali susikurti savo klasę/struktūrą, kuri turėtų laukus x, y ir z. Kitas variantas – pasinaudoti jau esančia Point3D klase:

 

String myArrayList = "[1.0 2.5 3.4;4.5 5.2 6.4;7.7 4.8 9.5]";
String input = myArrayList.toString().replace(" ", ", ").replace("[", "").replace("]", "");
String[] x = input.split(";")[0].split(",");
String[] y = input.split(";")[1].split(",");
String[] z = input.split(";")[2].split(",");
List<Point3D> points = new ArrayList<Point3D>();
for (int i = 0; i < x.length; i++) 
{
   points.add(new Point3D(Double.parseDouble(x[i]), Double.parseDouble(y[i]), Double.parseDouble(z[i])));   
}

 

Jei kartais palikau sintaksės klaidų, tikiuosi išsitaisysi.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...