# Tags in XML Datei mit Java erstellen



## tutto_a_posto (28. Nov 2021)

Hallo zusammen 

Ich hab zur Zeit ein Vorpraktikum und stecke bei einer Aufgabe fest: Eine CSV Datei in Java einlesen, dann in eine Java Swing Tabelle umwandeln, dann die Tabelle in eine XML Datei umwandeln wenn man auf ein Button klickt, dann Tags für die Spalten in der XML Datei erstellen.
Ich finde, dass diese Aufgabe sehr schwer ist, besonders für jmdn, der ein Praktikum sucht, weil mir das alles neu ist, aber ich hab es bis XML Datei geschafft; bei den Tags komme ich nicht weiter.
Ich wäre für jede Hilfe sehr dankbar.

```
import java.awt.*;
import java.awt.event.*;
import java.beans.XMLEncoder;
import java.io.*;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.metadata.IIOMetadataNode;
import javax.swing.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

class Ubuntu extends JDialog {

    int lineNumber = 0;
    String path = "ubuntu.csv";
    String line = "";
    JTable table;
    JFrame frame;
    JButton toXML;
    XMLEncoder encoder;
    private Object data;

    public Ubuntu() {}
    public void init() throws IOException, ParserConfigurationException, SAXException{

        frame = new JFrame();
        frame.setTitle("UBUNTU");
        String[] columnNames = {"", "", "", "", "", "", "", ""};


        BufferedReader br = new BufferedReader(new FileReader(path));

        List<List<String>> values = new ArrayList<>();
        while ((line = br.readLine()) != null) {
            ArrayList<String> row = new ArrayList<>();
            lineNumber++;
            for (String s : line.split(",")) {
                row.add(s);
            }
            values.add(row);
        }
        String[][] data = new String[values.size()][];

        for (int i = 0; i < values.size(); i++) {
            data[i] = new String[values.get(i).size() + 2];
            for (int j = 0; j < values.get(i).size(); j++) {
                data[i][j] = values.get(i).get(j);
            }
        }
        table = new JTable(data, columnNames);
        table.setFillsViewportHeight(true);
        table.setBounds(30, 40, 200, 300);

        JScrollPane scrollPane = new JScrollPane(table);
        frame.add(scrollPane);
        frame.setSize(800, 600);
        toXML = new JButton("To XML");
        toXML.setSize(100, 30);

        DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder;
        docBuilder = docBuilderFactory.newDocumentBuilder();

        String xmlData = "";
        xmlData = xmlData + "<?xml version=\"1.0\"?>\n" + "<data>\n";


        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < 8; j++) {
                xmlData = xmlData + data[i][j] + "\n";
            }
        }
        xmlData = xmlData + "</data>";



        Document doc = docBuilder.parse(new InputSource(new StringReader(xmlData)));

        NodeList nodes = doc.getElementsByTagName("string");
        for (int i = 0; i < nodes.getLength(); i++) {
            Node node = nodes.item(i);
            doc.renameNode(node, null, "teeeeeeeest");
            Element element = (Element) node;
            element.setAttribute("string", "test");
            element.setAttribute("string", "test2");
            element.setAttribute("string", "test3");
        }


//        for (int i = 0; i < data.length; i++) {
//            for (int j = 0; j < 8; j++) {
////                Element newNode = doc.createElement(data[i][j]);
////
////                doc.appendChild(newNode);
////                Node y = (Node) doc.getElementsByTagName(columnNames[j]);
////                doc.replaceChild(newNode, y);
//                Element x = null;
//                Element newNode = doc.createElement("test1");
//                Element newTitle = doc.createElement("test2");
//                Text newText = doc.createTextNode("test3");
//
//
//                newTitle.appendChild(newText);
//
//                newNode.appendChild(newTitle);
//
//                Element y=doc.getElementsByTagName("book")[0];
//
//                x.replaceChild(newNode,y);
//            }
//        }

        toXML.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getSource().equals(toXML)){
                    try {
                        encoder = new XMLEncoder(new FileOutputStream("ubuntuInXML.xml"));
                        encoder.writeObject(data);
                        encoder.close();
                    } catch (FileNotFoundException e1) {
                        e1.printStackTrace();
                    }
                    JOptionPane.showMessageDialog(frame, "XML Datei erfolgreich erstellt! Endlich :-)");
                }
            }
        });
        frame.setVisible(true);
        frame.add(toXML, BorderLayout.SOUTH);
    }

    public static void main(String[] args) throws IOException, ParserConfigurationException, SAXException {
        Ubuntu u = new Ubuntu();
        u.init();
    }

}
```


----------



## kneitzel (28. Nov 2021)

Also erst einmal: Alles so in eine Klasse zu quetschen macht es Dir selbst extrem schwer. Und damit wird es auch für uns sehr schwer, Dir zu helfen.

Mein Ratschlag wäre, das wenigstens etwas aufzuteilen:
- Eine Klasse für einen Datensatz. Keine Ahnung, was da in der csv Datei steht, aber wenn Du da ein sauberes Model hast, dann wird alles einfacher. Die Serialisierung in eine XML Datei geht dann fast ganz ohne Code.
- Dann hast Du eine DAO Klasse - die liest dann z.B. die CSV Datei ein und kann von mir aus auch den Export in eine XML Datei beinhalten (Wobei ich das in zwei Klassen aufteile .. sind halt zwei unterschiedliche Dinge.)

Damit wird die aktuelle Klasse schon deutlich übersichtlicher. Aber die Table wird dann über ein TableModel gemacht. Damit hast Du das Bindeglied zwischen UI und Model. Siehe dazu z.B. https://docs.oracle.com/javase/tutorial/uiswing/components/table.html

Ob man nun noch weiter geht und UI etwas mehr aufdröseln will in Controller und View ist dabei jetzt fast nebensächlich. Die oben genannten Dinge dürften alles deutlich vereinfachen, so dass Du nun eine kleine Hand voll Klassen hast, die alle ihre klare Aufgabe haben und die das Projekt übersichtlich hält.

Und Dein Problem mit der XML Datei dürfte dann erledigt sein, denn Du schreibst die Daten wirklich so einfach mit einem Encoder ohne da irgend was manuell aufzubauen.

Ich kenne Deine zeitlichen Vorgaben nicht, aber das wäre halt die Herangehensweise, die ich vorschlagen würde.


----------



## tutto_a_posto (29. Nov 2021)

Guten Morgen @kneitzel , vielen Dank für Deine Antwort. Ich schreibe alles neu, wie Du es beschrieben hast und poste später das Ergebnis hier.


----------



## kneitzel (29. Nov 2021)

Wenn Du da an irgend einer Stelle Fragen hast oder nicht weiter kommst, dann melde Dich einfach wieder. Viel Erfolg!


----------

