XML-Parser in MATLAB
Sie haben gelernt XML-Dateien zu schreiben und zu lesen, indem Sie grundlegende Funktionen in MATLAB angewendet haben. MATLAB bietet aber auch einen mächtigen XML-Parser an. Leider ist die Funktionsweise nicht gut dokumentiert. Nachfolgend geben wir Ihnen einige Beispiele, wie dieser Parser angewendet werden kann.
Hinweis: Sie können diesen Parser gerne anwenden, allerdings ist die Funktionsweise recht komplex! Es wird ein Zusatzkapitel im Tutorial Datenstrukturen geben, in dem dieser Parser behandelt wird.
Lesen einer XML-Datei
% (C) 2012, Datenverarbeitung in der Konstruktion, TU Darmstadt
% Author: André Picard
% Date: 22.11.2012
% Version: 1.0
%
%% Auslesen der XML-Datei
xml_read = xmlread('example_read.xml');
% Wurzelelement erhalten
rootNode = xml_read.getDocumentElement;
% 1. Unterelemente erhalten
parentNode = rootNode.item(0);
parentNodeName = parentNode.getNodeName;
%% Ein Element anhand seines Tags finden
findNode = xml_read.getElementsByTagName('Tag_01');
foundNode = findNode.item(0);
foundNode.getTextContent();
findNode = foundNode.getElementsByTagName('Tag_02');
findNodeLength = findNode.getLength();
foundNode = findNode.item(0);
foundNode.getTextContent();
%% Atrribute eines Elements ausgeben
foundNodeAttr = foundNode.getAttributes();
foundNodeAttr = foundNodeAttr.item(0);
foundNodeAttr.getName();
foundNodeAttr.getValue();
% Ein Element anhand seiner ID finden (benoetigt DTD oder manuelles Parsen)
findNode = xml_read.getElementById('tag03'); % using DTD
findNode2 = xml_read.getElementsByTagName('Tag_04'); % parsing manual
for ii = 1: numel(findNode)
findNode2.item(ii-1).setIdAttribute('id', true); % ein Attribut als "ID" setzen
end
findNode2 = xml_read.getElementById('tag04');
Schreiben einer XML-Datei
% (C) 2012, Datenverarbeitung in der Konstruktion, TU Darmstadt
% Author: André Picard
% Date: 22.11.2012
% Version: 1.0
%
%% Erstellen eines XML-Objekt
xml_write = com.mathworks.xml.XMLUtils.createDocument('Wurzel');
% DTD angeben und Wurzelelement erhalten
dtdNode = xml_write.createDocumentType('wurzel', '', 'example.dtd');
rootNode = xml_write.getDocumentElement;
% Kinder anhaengen
nodeParent = xml_write.createElement('Tag_01');
nodeParent.setTextContent('Hello');
rootNode.appendChild(nodeParent);
nodeChild = xml_write.createElement('Tag_02');
nodeChild.setAttribute('Attribute_01', 'My Information');
nodeChild.setTextContent(' another ');
nodeParent.appendChild(nodeChild);
subNode = xml_write.createTextNode('World');
nodeParent.appendChild(subNode);
subNode = xml_write.createElement('Tag_01');
subNode.setTextContent('!');
rootNode.appendChild(subNode);
% XML speichern
xmlwrite(xml_write); % Ausgabe im Command Window
xmlwrite('example_write.xml', xml_write); % Ausgabe in einer Datei
Verändern einer XML-Datei (mit gülter DTD)
% (C) 2012, Datenverarbeitung in der Konstruktion, TU Darmstadt
% Author: André Picard
% Date: 23.11.2012
% Version: 1.2
%
%% Ändern eines XML-Objekt
xml_read = xmlread('example_read.xml');
findNode = xml_read.getElementById('tag03');
findNode.getParentNode().removeChild(findNode);
% Schreiben des XMLs (ohne zusätzliche Zeilenumbrüche oder Leerzeichen!)
xml_alter = regexprep(char(xml_read.saveXML(xml_read.getDocumentElement)), ' [ ]* ',' ');
xml_alter = strrep(xml_alter, 'encoding="UTF-16"', 'encoding="UTF-8"');
fid = fopen('example_alter.xml', 'w');
fprintf(fid, '%s ', xml_alter);
fclose(fid);
% In XML-Objekt zurückwandeln
xml_alter = java.lang.String(xml_alter);
xml_alter = java.io.StringBufferInputStream(xml_alter);
factory = javaMethod('newInstance', 'javax.xml.parsers.DocumentBuilderFactory');
builder = factory.newDocumentBuilder;
xml_alter = builder.parse(xml_alter);