
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.
