Matlab読み書きxmlファイル

8937 ワード

xmlファイルはドキュメントオブジェクトモデルで表され、DOM(Document Object Model)と略称されます.Matlabでは、xmlreadを使用してxmlファイルをDOMノードに読み込み、xmlファイルに対する操作をDOMノードに変換し、xmlwriteを使用してDOMノードをxmlファイルに書き込む.
Matlab書き込みxmlファイル
個人情報を例にとると、通常、個人の情報には名前、性別、住所、電話などが含まれており、電話は携帯電話や座席機など複数ある可能性があり、コードは以下の通りである.
% file name
filename = 'info';

% create document
docNode = com.mathworks.xml.XMLUtils.createDocument('info');

% document element
docRootNode = docNode.getDocumentElement();

% name
nameNode = docNode.createElement('name');
nameNode.appendChild(docNode.createTextNode(sprintf('Jack')));
docRootNode.appendChild(nameNode);

% gender
genderNode = docNode.createElement('gender');
genderNode.appendChild(docNode.createTextNode(sprintf('male')));
docRootNode.appendChild(genderNode);

% address
addressNode = docNode.createElement('address');
addressNode.appendChild(docNode.createTextNode(sprintf('Beijing')));
docRootNode.appendChild(addressNode);

% phone
phoneElement = docNode.createElement('phone'); 
docRootNode.appendChild(phoneElement);

mobilephoneNode = docNode.createElement('mobilephone');
mobilephoneNode.appendChild(docNode.createTextNode('123456'));
phoneElement.appendChild(mobilephoneNode);

landlineNode = docNode.createElement('landline');
landlineNode.appendChild(docNode.createTextNode('012345'));
phoneElement.appendChild(landlineNode);

% xmlwrite
xmlFileName = [filename,'.xml'];
xmlwrite(xmlFileName,docNode);

xmlはDocument,Element,Nodeの3段階構造に分けられ,ElementはElementとNodeをネストすることができ,Nodeは最小のxml単位である.
なお、getDocumentElement()とcreateElement()とcreateTextNode()の3つの方法は、それぞれDocument、Element、Nodeを取得する3つの方法である.さらに、appendChild()の前の要素がxml要素の構造を決定し、最後にxmlwriteメソッドでxmlファイルに書き込まれ、最終的にxmlファイルは以下のようになります.

<info>
   <name>Jackname>
   <gender>malegender>
   <address>Beijingaddress>
   <phone>
      <mobilephone>123456mobilephone>
      <landline>012345landline>
   phone>
info>

Matlabはxmlファイルを読みます
読み取りプロセスにはxmlファイルを読み込むだけでなく、以前に記憶するinfoを解析する必要がある.xmlを例にとると、コードは以下の通りです.
% read xml
xmlDoc = xmlread('info.xml');

% name node
name_array = xmlDoc.getElementsByTagName('name');
name = char(name_array.item(0).getTextContent());
disp(['name:' name]);

% phone element
phone_array = xmlDoc.getElementsByTagName('phone');
phone = phone_array.item(0);
disp([char(phone.item(1).getNodeName()) ':' char(phone.item(1).getTextContent())]);
disp([char(phone.item(3).getNodeName()) ':' char(phone.item(3).getTextContent())]);

まずxmlreadでxmlファイル全体を読み込み、その後getElementsByTagName(‘name’)でnameノードを見つけ、getNodeByTagNameメソッドがないことに注意し、getElementsByTagName()で得られるのはNodeList配列であり、xmlはノードの再名を許可し、複数のnameノードがある可能性があるため、item(0)で最初のnameノードを得る.さらにgetTextContent()メソッドでnameノードの内容を出力する.
同様にgetElementsByTagName(‘phone’).item(0)はphoneノードを見つけ、ここでphoneはmobilephoneとlandlineの2つのサブノードを含み、テストによりphoneノードitem(0)、item(2)とitem(4)はいずれも#textのノードであり、item(1)とitem(3)はmobilephoneとlandlineの2つのノードを表し、getNodeName()とgetTextContent()でそれぞれノードの名前と内容が得られ、結果は以下の通りである.
name:Jack
mobilephone:123456
landline:012345