XML構造体配列の複数Fieldの中のそれぞれのField格納されている要素の取得
7 views (last 30 days)
Show older comments
Shinij Kumagai
on 28 Sep 2020
Commented: Shinij Kumagai
on 2 Oct 2020
構造体配列で、複数Fieldにまたがった下位配列の値を,for文を使わないで取得したいと考えています。
例えば、ChTable(n).Live.friutts.Ch(1,k).ChNameJp.Textの値を、for文を使わないで取得したいです。n=1000、k=1000と膨大になるため、実行速度が遅くなることを懸念しています。
for文を使わないで、値を取得するための知恵をかしていただけると幸いです。
0 Comments
Accepted Answer
Atsushi Ohashi
on 30 Sep 2020
ご質問の回答そのものではないかもしれませんが、ご懸念は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 Comments
Atsushi Ohashi
on 2 Oct 2020
実行速度の懸念がなくてよかったです。
追加のご質問ですが、質問で書かれているように、下記のような記述でルートのノードから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
More Answers (0)
See Also
Categories
Find more on 構造化データと XML ドキュメント in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!