JAVA - wczytanie pliku XML SAX/DOM

0

Cześć
Mam pewne problemy z aplikacją którą piszę. Aplikacja ta wczytuje plik .txt i następnie generuje wykres kołowy. Chciałby właśnie w niej zmienić to żeby zamiast plików txt wczytywała xml za pomocą parsera SAX albo DOM. Czytałem w źródłach internetowych że biblioteka JFreeChart ma taką możliwość ale mi konkretnie chodzi o jeden z tych parserów. Wujek Google mało mi pomógł.
Kod:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package generator.wykresów;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.DefaultFontMapper;
import com.lowagie.text.pdf.FontMapper;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.ui.RefineryUtilities;

/**
 *
 * @author DOM
 */

class JavaFilter extends javax.swing.filechooser.FileFilter
{
    public boolean accept(File f)
    {
        return f.getName().toLowerCase().endsWith(".txt")||
                f.isDirectory();
    }
    public String getDescription()
    {
        return "files (*.txt)";
    }
}
class JavaFilter2 extends javax.swing.filechooser.FileFilter
{
    public boolean accept(File f)
    {
        return f.getName().toLowerCase().endsWith(".jpg") ||
               f.getName().toLowerCase().endsWith(".jpeg") ||
               f.isDirectory();
    }
    public String getDescription()
    {
        return "files (*.jpg)";
    }
}
class JavaFilter3 extends javax.swing.filechooser.FileFilter
{
    public boolean accept(File f)
    {
        return f.getName().toLowerCase().endsWith(".pdf") ||
               f.isDirectory();
    }
    public String getDescription()
    {
        return "files (*.pdf)";
    }
}
class Ramka extends JFrame implements ActionListener
{
    JPanel panelglowny = new JPanel();
    JPanel panelCentralny = new JPanel();
    JPanel panelLewy = new JPanel();
    DefaultTableModel dtm;
    JButton generuj,zapiszdoPDF,zapiszdoJPG;
    JTable tabel;
    JScrollPane scrollpane;
    JLabel nazwaWykresu = new JLabel("Nazwa Wykresu");
    HashMap hashmap;
    JButton wczytajZPliku = new JButton("Wczytaj dane z pliku");
    JTextField nazwaw;
    JRadioButton kolowy, slupkowy, liniowy; //nowe

    JavaFilter fJavaFilter = new JavaFilter();
    JavaFilter2 fJavaFilter2 = new JavaFilter2();
    JavaFilter3 fJavaFilter3 = new JavaFilter3();
    File fFile = new File("domyslny.txt");
    File fFile2 = new File("wykres.jpeg");
    
    public JMenuBar menuBar;
    JMenu plik = new JMenu("Plik");
    JMenuItem zamknij = new JMenuItem("Zamknij");
    JMenu zapisz = new JMenu("Zapisz wykres");
    JMenuItem doPDF = new JMenuItem("jako PDF");
    JMenuItem doJPG = new JMenuItem("jako obraz JPEG");
    JButton pokaz, ukryj;
    JTextArea textArea = new JTextArea("");
    public Ramka()
    {
        setTitle("Tworzenie wykresów kołowych i słupkowych");
        setSize(600,400);
        hashmap = new HashMap();
        menuBar = new JMenuBar();
        panelglowny.setLayout(new BorderLayout());
        panelLewy.setLayout(new GridLayout(2,1));
        panelCentralny.setLayout(new GridLayout(1,1));
        generuj = new JButton("Wyświetl wykres");
        generuj.addActionListener(this);
        dtm = new DefaultTableModel();
        dtm.setColumnCount(3);
        dtm.setRowCount(6);
       
        tabel = new JTable(dtm);
        
        nazwaw = new JTextField();
        nazwaw.setPreferredSize(new Dimension(250,20));
        nazwaw.addActionListener(this);
        wczytajZPliku.addActionListener(this);
        
        zapiszdoPDF = new JButton("Zapisz jako PDF");
        zapiszdoPDF.addActionListener(this);

        zapiszdoJPG = new JButton("Zapisz do obrazu JPEG");
        zapiszdoJPG.addActionListener(this);
        JPanel p1 = new JPanel();
        p1.add(nazwaWykresu);
        p1.add(nazwaw);
        panelLewy.add(p1);
        
        JLabel pomoc = new JLabel("Pomoc");
        pokaz = new JButton("Pokaż pomoc");
        pokaz.addActionListener(this);
        ukryj = new JButton("Ukryj pomoc");
        ukryj.addActionListener(this);
        JPanel p2 = new JPanel();
        p2.add(wczytajZPliku);
        p2.add(zapiszdoPDF);
        p2.add(zapiszdoJPG);
        JPanel p3 = new JPanel();
        p3.add(pomoc);
        p3.add(pokaz);
        p3.add(ukryj);
        p3.add(textArea);
        //p2.add(textArea);
        panelLewy.add(p2);
        panelLewy.add(p3);
        panelCentralny.add(panelLewy);
        panelglowny.add(panelCentralny, BorderLayout.CENTER);
        panelglowny.add(generuj, BorderLayout.SOUTH);
        add(panelglowny);


        zamknij.addActionListener(this);
        doPDF.addActionListener(this);
        doJPG.addActionListener(this);
        plik.add(zamknij);
        zapisz.add(doPDF);
        zapisz.add(doJPG);
        menuBar.add(plik);
        menuBar.add(zapisz);
        setJMenuBar(menuBar);
        
        //radioButton
        JPanel p4 = new JPanel();
        JRadioButton kolowy = new JRadioButton("Kołowy");
        JRadioButton slubkowy = new JRadioButton("Słubkowy");
        JRadioButton liniowy = new JRadioButton("Linowy");
        JLabel typyWykresu = new JLabel("Typ Wykresu");
        p4.add(typyWykresu);
        p4.add(kolowy);
        p4.add(slubkowy);
        p4.add(liniowy);
        
        ButtonGroup bg  = new ButtonGroup();
        bg.add(kolowy);
        bg.add(slubkowy);
        bg.add(liniowy);
        
        boolean kolowy_selected = kolowy.isSelected();
        boolean slubkowy_selected = slubkowy.isSelected();
        boolean liniowy_selected = liniowy.isSelected();
        kolowy.setSelected(true);
        panelLewy.add(p4);
        
        //koniec
    }
    /*
     * @tworzenie wykresu kołowego
     */
    public JFreeChart create3DChart(String title, HashMap hashmap)
    {
        DefaultPieDataset dataset = new DefaultPieDataset();
        Set set = hashmap.entrySet();

        Iterator i = set.iterator();

        while(i.hasNext())
        {
            Map.Entry me = (Map.Entry)i.next();
            dataset.setValue(me.getKey().toString(),Double.valueOf(me.getValue().toString()).doubleValue() );
        }
        //create a chart
        JFreeChart chart = ChartFactory.createPieChart3D
                (title,
                dataset,
                true, //legend
                true, //tooltips
                false);//URLs
        return chart;        
    }
    /*
     * tworzenie wykresu z ramką i wyświetlanie go
     */
    public Ramka(String title, HashMap hashmap)
    {   
        super("Wykres");
         JFreeChart chart = create3DChart(title, hashmap);
         ChartPanel chartPanel = new ChartPanel(chart,false);
         chartPanel.setPreferredSize(new Dimension(650,500));

         setContentPane(chartPanel);
         setDefaultCloseOperation(this.DISPOSE_ON_CLOSE);
    }
    /*
     * Metody potrzebne do zapisywania do pliku pdf
     * @zapisywanie do pliku PDF
     */
    public static void saveChartAsPDF(File file,
                                        JFreeChart chart,
                                        int width,
                                        int height,
                                        FontMapper mapper) throws IOException
    {
        OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
        writeChartAsPDF(out, chart, width, height, mapper);
        out.close();
    }
    public static void writeChartAsPDF(OutputStream out,
                                        JFreeChart chart,
                                        int width,
                                        int height,
                                        FontMapper mapper)throws IOException
    {
        Rectangle pagesize = new Rectangle(width, height);
        Document document = new Document(pagesize, 50,50,50,50);
        try
        {
            PdfWriter writer = PdfWriter.getInstance(document, out);
            document.addAuthor("JFreeChart");
            document.addSubject("Zapis do pdf");
            document.open();
            PdfContentByte cb = writer.getDirectContent();
            PdfTemplate tp = cb.createTemplate(width, height);
            Graphics2D g2 = tp.createGraphics(width, height,mapper);
            Rectangle2D r2D = new Rectangle2D.Double(0,0,width,height);
            chart.draw(g2, r2D);
            g2.dispose();
            cb.addTemplate(tp, 0, 0);
        }catch(DocumentException de){}
        document.close();
    }
    /*
     * koniec metod potrzebnych do zapisywania do pdf
     */
    public void generujWykres()
    {
        for(int i=0; i<tabel.getRowCount(); i++)
            {
                if((tabel.getValueAt(i, 1) != null) && (tabel.getValueAt(i, 2) != null) )
                {
                     try
                     {
                         hashmap.put(tabel.getValueAt(i, 1), (tabel.getValueAt(i, 2)));

                     }catch(Exception exc){System.out.println("exc");}
                }
            }
    }
    public void actionPerformed(ActionEvent e)
    {
        boolean status = false;
        String command = e.getActionCommand();

        if(command.equals("Wczytaj dane z pliku"))
        {
            status = otworzPlik();
            if(!status)
            {
                JOptionPane.showMessageDialog(null, "Błąd przy otwieraniu",
                        "Błąd otwierania pliku",JOptionPane.ERROR_MESSAGE);
            }
        }
        if(e.getSource() == generuj)
        {
            generujWykres();
            
            Ramka barchart = new Ramka(nazwaw.getText(), hashmap);
            barchart.pack();
            RefineryUtilities.centerFrameOnScreen(barchart);
            barchart.setVisible(true);
        }
        
        if(e.getSource() == zapiszdoPDF || (e.getSource() == doPDF))
        {
            zapiszPlik(2);
        }
        if(e.getSource() == zapiszdoJPG || (e.getSource() == doJPG))
        {
            zapiszPlik(1);
        }
        if(e.getSource() == zamknij)
        {
            System.exit(0);
        }
        if(e.getSource() == pokaz)
        {
            textArea.setText("Wczytywanie z pliku w formacie: \nKat1, 12.5 \nKat2, 34.6 \nKat3, 89 \nKat4, 12.6");
        }
        if(e.getSource() == ukryj)
        {
            textArea.setText("");
        }
    }
    boolean zapiszPlik(int wybor)
    {
        File file = null;
        JFileChooser fc = new JFileChooser();

        fc.setCurrentDirectory(new File("."));
        
        //dodanie domyślnej nazwy do pliku do zapisania
        if(wybor == 1)
        {
            fc.setSelectedFile(new File("wykres.jpeg"));
            fc.setFileFilter(fJavaFilter2);
        }
        else if (wybor == 2)
        {
            fc.setSelectedFile(new File("wykres.pdf"));
            fc.setFileFilter(fJavaFilter3);
        }
        
        //otwieranie okna
        int result = fc.showSaveDialog(this);
        if(result == JFileChooser.CANCEL_OPTION)
        {
            return true;
        }
        else if(result == JFileChooser.APPROVE_OPTION)
        {
            fFile = fc.getSelectedFile();
            if(fFile.exists())
            {
                int potwierdzenie = JOptionPane.showConfirmDialog(null,
                        "Czy napewno nadpisać plik?","Potwierdzenie nadpisania",
                        JOptionPane.OK_CANCEL_OPTION,
                        JOptionPane.QUESTION_MESSAGE);
                if(potwierdzenie == JOptionPane.CANCEL_OPTION) return false;
            }
            if(wybor == 1)
            {
                try
                {
                    generujWykres();
                    JFreeChart chart = create3DChart(nazwaw.getText(), hashmap);
                    ChartUtilities.saveChartAsJPEG(fFile, chart, 800, 600);
                } catch (Exception ex) {JOptionPane.showMessageDialog(null, "Problem z zapisaniem wykresu\n jako obraz jpeg");}
            }
            else if(wybor == 2)
            {
                try
                {
                    generujWykres();
                    JFreeChart chart = create3DChart(nazwaw.getText(), hashmap);
                    saveChartAsPDF(fFile, chart, 400,300,new DefaultFontMapper());
                }catch(IOException exc){}
            }
           
            return true;
        }
        else
        {
            return false;
        }

    }
    boolean otworzPlik()
    {
        JFileChooser fc = new JFileChooser();
        fc.setDialogTitle("Otwórz plik");

        //wybueranie tylko plikĂłw, nie katalogĂłw
        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fc.setCurrentDirectory(new File("."));
        //dodanie filtrĂłw
        fc.setFileFilter(fJavaFilter);
        //okienko do otwierania
        int result = fc.showOpenDialog(this);
        if(result == JFileChooser.CANCEL_OPTION)
        {
            return true;
        }
        //wybranie pliku i wczytanie zawartości
        else if(result == JFileChooser.APPROVE_OPTION)
        {
            fFile = fc.getSelectedFile();
            czytajPlik(fFile);
        }
        else
        {
            return false;
        }

        return true;
    }
    public void czytajPlik(File file)
    {
        
        String line;
        int i=0;
        int ilewierszy = dtm.getRowCount();
        int wiersz=0;
        try
        {
            FileReader in = new FileReader(file);
            BufferedReader br = new BufferedReader(in);

            while((line = br.readLine()) !=null)
            {
                try
                {
                    if (wiersz >= ilewierszy)
                    {
                        dtm.addRow(new Object[]{});
                        ilewierszy++;
                    }
                        String[] temp = line.split(",");
                        dtm.setValueAt(temp[0], i, 1);
                        dtm.setValueAt(temp[1], i, 2);
                    i++;
                    wiersz++;
                }catch(Exception exc)
                {
                    JOptionPane.showMessageDialog(null,"Błędny format danych w pliku!!");
                    dtm.setValueAt("", 0, 1);
                    break;

                }
                
            }
            in.close();
        }catch(IOException e){}
    }
}

public class GeneratorWykresów {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Ramka r = new Ramka();
        r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        r.setVisible(true);
    }
}
0

A sorry za post pod postem
Struktura pliku xml do wczytywania wygląda tak:

<?xml version="1.0" encoding="ISO-8859-2"?>
<raport>
	<franek>
		6
	</franek>
	<adek>
		6
	</adek>
	<pozostali>
		88
	</pozostali>
</raport>
1

XPathem nie możesz tego xmla czytać?

0
  1. XPathem nie, chodzi mi o te dwa wymienione wcześniej pasery.
  2. Problem jest taki że wczytany przez program plik xml ma być dostępny do tworzenia wykresu kołowego. Nie wiem jak zrobić żeby wykorzystać dane z pliku do dataset w
public JFreeChart create3DChart
2

No to załaduj to do DOMa a potem wyciągaj po kolei wartości z xmla. Nadal nie rozumiem gdzie widzisz problem.
http://tutorials.jenkov.com/java-xml/dom.html
http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/
Tu masz przykłady jak operować DOMem.

0

Dzięki.
Zmieniłem teraz metodę wczytywania pliku

public void czytajPlik(File file) 
    {
        try {               
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                org.w3c.dom.Document doc = dBuilder.parse(new FileInputStream(file));
                doc.getDocumentElement().normalize();
              
                NodeList nodes = doc.getElementsByTagName("raport");
                
                for (int i = 0; i < nodes.getLength(); i++) {
                    Node node = nodes.item(i);

                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                            Element element = (Element) node;
                       }
                   }
                               
                } catch (Exception ex) {
                ex.printStackTrace();
                }
    }

Teraz jak mam wyciągać elementy z xml? W metodzie generujWykres czy podczas tworzenia wykresu?

2

Chłopie, czy ty w ogóle patrzysz na te linki które ci podałem? Bo odnoszę wrażenie że nic a nic. Masz w drugim linku pokazane jak wczytać wartości węzłow z xmla. Moim zdaniem parametry powinieneś wyciągać tam gdzie czytasz plik a potem już tylko z nich korzystać.

0

Dzięki. Przepraszam jeżeli zadaje głupie pytania, ale uczę się Javy od 3 miesięcy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1