Zielony Smok - logo witryny

Zapis macierzy do pliku XML

Macierze możemy zapisywać do plików XML. Do zapisania użyjemy metod writeXML i readXML z klasy MatrixUtil.

 public static void writeXML(Matrix matrix, String path) {
        double[][] tabl = matrix.getArray();
        PrintWriter pw = null;
        try {
            pw = new PrintWriter(path);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        pw.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        pw.println("<!DOCTYPE matrix SYSTEM \"matrix.dtd\">");
        pw.println("<matrix rows=\"" + matrix.getRowCount() +
                            + "\"" + " cols=\"" +
                + matrix.getColCount() + "\">");
        for (int y = 0; y < matrix.getRowCount(); y++) {
            pw.println("<row>");
            for (int x = 0; x < matrix.getColCount(); x++) {
                pw.println("<col>" + tabl[y][x] + "</col>");
            }
            pw.println("</row>");
        }
        pw.println("</matrix*gt;");
        pw.close();
    }
public static Matrix readXML(String path) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.
             newInstance();
        DocumentBuilder builder = null;
        try {
            builder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        File file = new File(path);
        Document doc = null;
        try {
            doc = builder.parse(file);
        } catch (SAXException | IOException e) {
            e.printStackTrace();
        }
        Element root = doc.getDocumentElement();
        NamedNodeMap attributes = root.getAttributes();
        Node r = attributes.item(0);
        int ro = Integer.parseInt(r.getNodeValue());
        Node c = attributes.item(1);
        int co = Integer.parseInt(c.getNodeValue());
        double[][] arr = new double[ro][co];
        int m = -1;
        int n;
        NodeList rows = root.getChildNodes();
        for (int i = 0; i < rows.getLength(); i++) {
            Node row = rows.item(i);
            if (row instanceof Element) {
                m++;
                Element row1 = (Element) row;
                NodeList cols = row1.getChildNodes();
                n = -1;
                for (int j = 0; j < cols.getLength(); j++) {
                    Node col = cols.item(j);
                    if (col instanceof Element) {
                        n++;
                        Text t = (Text) col.getFirstChild();
                        String v = t.getData().trim();
                        arr[m][n] = Double.parseDouble(v);
                    }
                }
            }
        }
        return new Matrix(arr);
    }

Zapis macierzy do pliku XML

Przykład zapisu w pliku Matrix048:

double[][] arr = {{6, 2, 3}, {4, 7, 5}, {1, 9, 8}};
Matrix matrix = new Matrix(arr);
MatrixUtil.writeXML(matrix, "matrices/assets/matrix5.xml");

Zapisujemy macierz do pliku XML. Po zapisaniu w folderze matrices/assets pojawia się plik matrix5.xml. W pliku umieściliśmy informacje o pliku matrices.dtd oraz informacje o liczbie rzędów i kolumn w postaci atrybutów znacznika <matrix> co pozwoli na łatwiejsze odczytywanie danych z pliku.

A oto zawartość pliku:

Plik XML z macierzą

Informacje zawarte w pliku matrices.dtd pozwalają na weryfikację poprawności pliku XML, który odwołuje się do tego pliku.

Plik DTD dla macierzy

W tym pliku zawarłem informacje:

  • element główny <matrix> musi zawierać co najmniej jeden element <row>
  • element <row> musi zawierać co najmniej jeden element <col>
  • element <col> zawiera tekst
  • element główny <matrix> ma dwa obowiązkowe atrybuty
    • atrybut o nazwie <rows> zawierający jako wartość dowolny łańcuch znaków
    • atrybut o nazwie <cols> zawierający jako wartość dowolny łańcuch znaków

Odczytywanie macierzy z pliku XML

Przykład w pliku Matrix049:

 Matrix mat = MatrixUtil.readXML(" +
        + matrices/assets/matrix5.xml");
        mat.printToConsole();

Odczytujemy wcześniej zapisaną macierz. Wyświetlamy macierz na konsoli.

6.0 2.0 3.0
4.0 7.0 5.0
1.0 9.0 8.0

Pliki do ściągnięcia

Coś przegapiłem :-). Pliki umieszczone są w następnym artykule.