Προς το περιεχόμενο

JAVA kai XML Files??


vasgen

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα σε ολους,

 

Εχουμε ενα προβλημα για ενα project για το πανεπιστημιο?

Εχουμε το παρακατω XML αρχειο και πρεπει να το διαβαζουμε σε JAVA και να εχουμε εξοδο ενα .TXT αρχειακι το οποιο να ειναι του τυπου

π.χ. "DSC01909 x=250 y=240 χ1=350 y1=300"

"DSC01901 x=140 y=135 x1=250 y1=220"

k.o.k.

Δηλαδη να μας γραφει το ονομα της εικονας και την αρχη και το τελος των pixel που ενδιαφερουν μεσα απο την εικονα οπως εμφανιζονται στο XML αρχειο...

Εδω ειναι ενα κομματι του XML αρχειου και του κωδικα σε JAVA..

Οποιος μπορει να βοηθησει θα του ειμαι ευγνωμων....

 

import java.io.File;

import org.w3c.dom.Document;

import org.w3c.dom.*;

 

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.DocumentBuilder;

import org.xml.sax.SAXException;

import org.xml.sax.SAXParseException;

 

public class ReadAndPrintXMLFile{

 

public static void main (String argv []){

 

 

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();

Document doc = docBuilder.parse (new File("objects.xml"));

 

// normalize text representation

doc.getDocumentElement ().normalize ();

System.out.println ("Root element of the doc is " +

doc.getDocumentElement().getNodeName());

 

 

NodeList listOfPictures = doc.getElementsByTagName("picture");

int totalPictures = listOfPictures.getLength();

System.out.println("Total no of pictures : " + totalPictures);

 

for(int s=0; s<listOfPictures.getLength() ; s++){

 

 

Node firstPictureNode = listOfPictures.item(s);

if(firstPictureNode.getNodeType() == Node.ELEMENT_NODE){

 

 

Element firstPictureElement = (Element)firstPictureNode;

 

//-------

NodeList firstNameList = firstPictureElement.getElementsByTagName("X");

Element firstNameElement = (Element)firstNameList.item(0);

 

NodeList textFNList = firstNameElement.getChildNodes();

System.out.println("X : " +

((Node)textFNList.item(0)).getNodeValue().trim());

 

//-------

NodeList lastNameList = firstPictureElement.getElementsByTagName("Y");

Element lastNameElement = (Element)lastNameList.item(0);

 

NodeList textLNList = lastNameElement.getChildNodes();

System.out.println("Y : " +

((Node)textLNList.item(0)).getNodeValue().trim());

 

 

}//end of if clause

 

}//end of for loop with s var

 

}//end of main

 

 

}

 

 

Εχουμε φτασει μεχρι εδω αλλα καπου το χασαμε και θα θελαμε την βοηθεια καπιου πιο ειδικου...

objects.txt

  • 1 μήνα μετά...
Δημοσ.

Καλησπερα σε ολους,

 

Εχω το εξης προβλημα εχω ενα XML αρχειο και το κανω parse με Java, το 1ο προβλημα μου ειναι οτι δεν μου κανει ολο το XML αρχειο Parse αλλα ενα κομματι μονο και 2ο οτι εκει που κανει parse μεσα στο tag <dir_path> βγαζει σαν εξοδο μονο τα πρωτα Χ και Υ που βρισκει, και οχι ολα οσα ειναι μεσα σε καθε tag <dir_path>, αν μπορει καπoioς να βοηθησει ...

 

Ευχαριστω εκ των προτερων...

 

>

import java.io.File;
import org.w3c.dom.Document;
import org.w3c.dom.*;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException; 

public class ReadAndPrintXMLFile{

   public static void main (String argv []){
  try {

           DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
           
           DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
           Document doc = docBuilder.parse (new File("objects.xml"));
       
           // normalize text representation
           doc.getDocumentElement().normalize();
           System.out.println ("Root element of the doc is " + 
                doc.getDocumentElement().getNodeName());


           NodeList listOfPictures = doc.getElementsByTagName("picture");
           int totalPictures = listOfPictures.getLength();
           System.out.println("Total no of pictures : " + totalPictures);

           for(int s=0; s<listOfPictures.getLength() ; s++){

               Node firstPictureNode = listOfPictures.item(s);
               if(firstPictureNode.getNodeType() == Node.ELEMENT_NODE){


                   Element firstPictureElement = (Element)firstPictureNode;

                   NodeList PicturesNamesList = firstPictureElement.getElementsByTagName("dir_path");
                   Element PicNameElement = (Element)PicturesNamesList.item(0);

                   NodeList textPicList = PicNameElement.getChildNodes();
                   System.out.println("Picture_Name: " +
                          ((Node)textPicList.item(0)).getNodeValue().trim());


                   //-------
                   NodeList XcordList = firstPictureElement.getElementsByTagName("x");
                   Element XcordElement = (Element)XcordList.item(0);

                   NodeList textXList = XcordElement.getChildNodes();
                   System.out.println("X : " +
                          ((Node)textXList.item(0)).getNodeValue().trim());

                  

                   //-------
                   NodeList YcordList = firstPictureElement.getElementsByTagName("y");
                   Element YcordElement = (Element)YcordList.item(0);

                   NodeList textYList = YcordElement.getChildNodes();
                   System.out.println("Y : " +
                          ((Node)textYList.item(0)).getNodeValue().trim());


               }//end of if clause


           }//end of for loop with s var
        } catch (Exception ex) {
    System.out.print("exception");
           }



   }//end of main
}

objects.txt.zip

Δημοσ.

Having fun with XML, ε??? Αν θέλεις έναν πιο γρήγορο και εύκολο τρόπο για parsing, δοκίμασε κάποια βιβλιοθήκη όπως το dom4j

 

http://www.dom4j.org/

 

Αυτό, με χρήση του xpath, σου επιτρέπει να βρίσκεις γρήγορα όλα τα nodes, χωρίς να γράφεις εσύ κώδικα. Ρίξε μια ματιά...

Δημοσ.

Σωστά μου φάνηκε ότι σε έχω ξαναματαδεί ;). Δεν είναι κακό που επιμένεις, αλλά θα ήταν σωστό να συνέχιζε το προηγούμενο θέμα ώστε να υπάρχει συνέχεια;

 

Για να δούμε τι θα δούμε.....

 

[bRB, το κοιτάω για να σε βοηθήσω, ελπίζω σύντομα ;)]

Δημοσ.

Δεν ειναι οτι επιμενω εγω, η Java επιμενει μαζι μου...:-D Εχω προχωρηση λιγο τον κωδικα και σκαλωσα παλι..Οποια βοηθεια παιζει δεκτη...

Ευχαριστω.......

Δημοσ.

το 1ο προβλημα μου ειναι οτι δεν μου κανει ολο το XML αρχειο Parse αλλα ενα κομματι μονο

Parse κάνει όλο το XML, όπως άλλωστε σου λέει και το

>System.out.println("Total no of pictures : " + totalPictures);

Σύνολο 41, έτσι;

 

Το πρόβλημά σου βρίσκεται εδώ:

>
   <picture>
       <dir_path>DSC01019</dir_path>
       <lastEdit>Wed Nov 05 13:10:33 CET 2008</lastEdit>
   </picture>

 

και θα το είχες δει αν δεν είχες κάνει αυτό:

>
}
catch (Exception ex) {
   System.out.print("exception");
}

 

αλλά αυτό:

>
catch (Exception oops) {
   oops.printStackTrace();
}

 

το οποίο όταν τρέχεις τον κώδικά σου βγάζει το μήνυμα λάθους

>
Picture_Name: DSC01019
java.lang.NullPointerException
at ReadAndPrintXMLFile.main(ReadAndPrintXMLFile.java:52)

 

Άρα πηγαίνεις στη γραμμή 52 του κώδικά σου και βλέπεις ότι το XcordElement είναι NULL διότι στη γραμμή 49 ζητάς από το firstPictureElement να σου φέρει όλα τα παιδιά του με το όνομα "x", που όμως τέτοια παιδιά δεν έχει.

 

 

2ο οτι εκει που κανει parse μεσα στο tag <dir_path> βγαζει σαν εξοδο μονο τα πρωτα Χ και Υ που βρισκει, και οχι ολα οσα ειναι μεσα σε καθε tag <dir_path>

 

Δυστυχώς τα προγράμματα κάνουν μόνο αυτό που τους λέμε, έτσι και το δικό σου. Δεν ξέρω αν σε κώδικά που δεν φαίνεται εδώ προσπάθησες κάτι άλλο, αλλά εδώ δεν προσπαθείς πουθενά να τυπώσεις το element <points> :eek:

 

Βάλε το παρακάτω μέσα

>
//-------vag_pRiMi
Element points = (Element)firstPictureElement.getElementsByTagName("points").item(0);
System.out.println("Points in picture: " + points.getElementsByTagName("point").getLength());

Αυτό θα σου τυπώσει πόσα <point> elements έχεις σε κάθε <object>.

 

Επομένως ποτέ άδεια catch blocks και πάντα με printStackTrace()

 

HTH

Δημοσ.

Μαστορη, ευχαριστω παρα πολυ για τον χρονο σου, απλα με εχουν βαλει να φτιαξω αυτο το μαραφετη και οπως θα καταλαβες και σει δεν εχω και πολυ εμπειρια επη του θεματος.... Σε ευχαριστω και παλι....

Δημοσ.

catch (Exception oops) {

oops.printStackTrace();

}

 

Φιλος εκανα την αλλαγη στο exception και οντος μου βγαζει αυτο το λαθος που μου αναφερεις, αλλα δεν μπορω να καταλαβω τι ειναι αυτο που ειναι Null και πρεπει να το αλλαξω.? Σορρυ για την ταλαιπωρια...αν σου ειναι ευκολο.......

Δημοσ.
catch (Exception oops) {

oops.printStackTrace();

}

 

Φιλος εκανα την αλλαγη στο exception και οντος μου βγαζει αυτο το λαθος που μου αναφερεις, αλλα δεν μπορω να καταλαβω τι ειναι αυτο που ειναι Null και πρεπει να το αλλαξω.? Σορρυ για την ταλαιπωρια...αν σου ειναι ευκολο.......

 

huhu :lol:

  • Super Moderators
Δημοσ.

Λάθος forum διαλέξαν μερικά νεόκοπα μέλη για να βγάλουν λεφτά - και να μας κάνουν και διάλεξη περί fora, από πάνω. :mad:

Δημοσ.
Λάθος forum διαλέξαν μερικά νεόκοπα μέλη για να βγάλουν λεφτά - και να μας κάνουν και διάλεξη περί fora, από πάνω. :mad:

 

Τι να βγαλει ??? ενα 20ρικακι το μηνα ?? Αυτο ειναι γελιο!! Δε παει καλυτερα να μιρασει κανα φιλαδιο, περισοτερα θα βγαλει!

Δημοσ.

δεν μπορω να καταλαβω τι ειναι αυτο που ειναι Null και πρεπει να το αλλαξω.?

 

Όπως και για κάθε <picture> έτσι και στο παρακάτω

>
   <picture>
       <dir_path>DSC01019</dir_path>
       <lastEdit>Wed Nov 05 13:10:33 CET 2008</lastEdit>
   </picture>

 

ο κώδικάς σου εκτελεί τη γραμμή:

>NodeList XcordList = firstPictureElement.getElementsByTagName("x");

 

Το <picture> 'DSC01019' όμως δεν έχει παιδιά με όνομα "x". Έτσι το NodeList XcordList είναι null. Ή με άλλα λόγια η 'μέθοδος' getElementsByTagName("x") επιστρέφει null.

 

Οι λύσεις είναι δύο:

  1. Συμπληρώνεις τα παιδιά του <picture> που λείπουν
  2. Προσθέτεις έλεγχο για null

 

Για το [2] κάνεις το εξής απλό:

>NodeList XcordList = firstPictureElement.getElementsByTagName("x");
[b]if (XcordList != null) {[/b]
   Element XcordElement = (Element)XcordList.item(0);

   NodeList textXList = XcordElement.getChildNodes();
   System.out.println("X : " +
          ((Node)textXList.item(0)).getNodeValue().trim());
[b]}[/b]

 

HTH :-)

Δημοσ.

Ευχαριστω Vag_...., Μια τελευταια ερωτηση τωρα εχω διαβασει το XML αρχειο , εχω διαβασει τις τιμες που με ενδιαφερουν και τις εχω αποθηκευση σε Vector κανοντας τες πρωτα parse se integer..Ξερει κανεις πως θα εκτυπωσω σε txt αρχειο τις τιμες απο το Vector...???

 

Ευχαριστω και παλι....

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...