Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

XML ドキュメントのインポート

ローカル ディスクまたは URL から XML ファイルを読み取るには、関数 xmlread を使用します。xmlread では、ファイルの内容をドキュメント オブジェクト モデル (DOM) ノードに返します。詳細は、以下の項目を参照してください。

XML ドキュメント オブジェクト モデル (DOM) とは

ドキュメント オブジェクト モデルでは、XML ファイル内のすべての項目がノードに対応します。DOM ノードのプロパティとメソッド (つまり、ノードを作成し、そこにアクセスする方法) は、World Wide Web コンソーシアムによって定められた標準に従っています。

たとえば、次のサンプル XML ファイルについて考えます。

<productinfo>

<!-- This is a sample info.xml file. -->

<list>

<listitem>
<label color="blue">Import Wizard</label>
<callback>uiimport</callback>
<icon>ApplicationIcon.GENERIC_GUI</icon>
</listitem>

<listitem>
<label color="red">Profiler</label>
<callback>profile viewer</callback>
<icon>ApplicationIcon.PROFILER</icon>
</listitem>

</list>
</productinfo>

ファイル内の情報は、DOM において以下のタイプのノードにマップされます。

  • "要素ノード" — タグ名に対応します。サンプルの info.xml ファイルでは、以下のタグが要素ノードに対応します。

    • productinfo

    • list

    • listitem

    • label

    • callback

    • icon

    この場合、list 要素は、listitem 要素という "子" ノードの "親" となります。productinfo 要素は "ルート" 要素ノードです。

  • "テキスト ノード" — 要素ノードに関連付けられた値が含まれます。すべてのテキスト ノードは要素ノードの子です。たとえば、Import Wizard テキスト ノードは最初の label 要素ノードの子です。

  • "属性ノード" — 要素ノードに関連付けられた名前/値の組が含まれます。たとえば、最初の label 要素ノードでは、color が属性の名前で blue がその値です。属性ノードは他のノードの親や子になることはありません。

  • "コメント ノード" — ファイル内に <!--Sample comment--> という形式の追加テキストが含まれます。

  • "ドキュメント ノード" — ファイル全体に対応します。ドキュメント ノードでメソッドを使用して、要素、テキスト、属性、またはコメントの各ノードを新たに作成します。

DOM ノードのメソッドとプロパティの一覧については、https://docs.oracle.com/javase/7/docs/apiorg.w3c.dom パッケージの説明を参照してください。

例 — XML ファイルでのテキストの検索

完全版の matlabroot/toolbox/matlab/general/info.xml ファイルには、以下のようないくつかの listitem 要素が含まれています。

<listitem>
<label>Import Wizard</label>
<callback>uiimport</callback>
<icon>ApplicationIcon.GENERIC_GUI</icon>
</listitem>

label 要素の 1 つには子テキストの Plot Tools が含まれます。同じ listitem の中で callback 要素のテキストを見つけるとします。次の手順に従います。

  1. 変数を初期化し、xmlread を呼び出してドキュメント ノードを取得します。

    findLabel = 'Plot Tools';
    findCbk = '';
    
    xDoc = xmlread(fullfile(matlabroot, ...
                   'toolbox','matlab','general','info.xml'));
  2. すべての listitem 要素を検索します。getElementsByTagName メソッドにより、子ノードについての情報を含む階層リストが返されます。

    allListitems = xDoc.getElementsByTagName('listitem');

    メモ

    DOM メソッドによって返される一覧では 0 ベースのインデックスが使用されます。

  3. それぞれの listitem について、label 要素のテキストを検索対象のテキストと比較します。正しい label を見つけたら、callback テキストを取得します。

    for k = 0:allListitems.getLength-1
       thisListitem = allListitems.item(k);
       
       % Get the label element. In this file, each
       % listitem contains only one label.
       thisList = thisListitem.getElementsByTagName('label');
       thisElement = thisList.item(0);
    
       % Check whether this is the label you want.
       % The text is in the first child node.
       if strcmp(thisElement.getFirstChild.getData, findLabel)
           thisList = thisListitem.getElementsByTagName('callback');
           thisElement = thisList.item(0);
           findCbk = char(thisElement.getFirstChild.getData);
           break;
       end
       
    end
  4. 最終結果を表示します。

    if ~isempty(findCbk)
        msg = sprintf('Item "%s" has a callback of "%s."',...
                      findLabel, findCbk);
    else
        msg = sprintf('Did not find the "%s" item.', findLabel);
    end
    disp(msg);

構造体配列を作成して XML ファイルからのデータを格納する例は、関数 xmlread のリファレンス ページを参照してください。