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:
Informacje zawarte w pliku matrices.dtd pozwalają na weryfikację poprawności pliku XML, który odwołuje się do tego pliku.
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.