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);