XML構造体配列の複数Fieldの中のそれぞれのField格納されている要素の取得
4 ビュー (過去 30 日間)
古いコメントを表示
構造体配列で、複数Fieldにまたがった下位配列の値を,for文を使わないで取得したいと考えています。
例えば、ChTable(n).Live.friutts.Ch(1,k).ChNameJp.Textの値を、for文を使わないで取得したいです。n=1000、k=1000と膨大になるため、実行速度が遅くなることを懸念しています。
for文を使わないで、値を取得するための知恵をかしていただけると幸いです。
0 件のコメント
採用された回答
Atsushi Ohashi
2020 年 9 月 30 日
ご質問の回答そのものではないかもしれませんが、ご懸念はForループの回数が多くなることで実行速度が遅くなることだと思いますので、For文の回数が減る回答とさせてください。
XMLを構造体の形にせず、XMLファイルを読み込んで該当するノードのみを取得し、それに対してForで値を取得する方法になります。以下にサンプルを記載しましたので、ご参考になれば幸いです。
DOM = xmlread('ChSetting.chs');
nodes = DOM.getElementsByTagName('ChNameJp');
% ゼロから始まります
for n = 0: nodes.getLength-1
if nodes.item(n).hasChildNodes
fprintf('%d: %s\n', n, char( nodes.item(n).item(0).getNodeValue ) );
end
end
もしくは、XMLファイルを読み込んで、そこからXMLを構造体へ変換されていると思いますので、変換の過程で必要なデータを抽出するのもあるかと思います。
3 件のコメント
Atsushi Ohashi
2020 年 10 月 2 日
実行速度の懸念がなくてよかったです。
追加のご質問ですが、質問で書かれているように、下記のような記述でルートのノードからfruitsのノードを取得することができます。
nodes = DOM.getElementsByTagName('fruits');
ここから最初にご質問であった ChNameJp の値を取得する場合には、上記で得られた nodes に対して同様な実行をします。今回のサンプルXMLではfruitsが1つのみでしたが、fruits のタグが他にある場合は nodes.item(0) を nodes.item(i) などにして fruits 分だけループさせます
最初のループは今回は不要ですが、以下はスクリプト例です。
DOM = xmlread('ChSetting.chs');
nodes = DOM.getElementsByTagName('fruits');
% ゼロから始まります
for i = 0: nodes.getLength-1
cnodes = nodes.item(i).getElementsByTagName('ChNameJp');
for n = 0: cnodes.getLength-1
if cnodes.item(n).hasChildNodes
fprintf('%d: %s\n', n, char( cnodes.item(n).item(0).getNodeValue ) );
end
end
end
その他の回答 (0 件)
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!