Azzera filtri
Azzera filtri

XML構造体配列の複​数Fieldの中のそ​れぞれのField格​納されている要素の取​得

10 visualizzazioni (ultimi 30 giorni)
Shinij Kumagai
Shinij Kumagai il 28 Set 2020
Commentato: Shinij Kumagai il 2 Ott 2020
構造体配列で、複数Fieldにまたがった下位配列の値を,for文を使わないで取得したいと考えています。
例えば、ChTable(n).Live.friutts.Ch(1,k).ChNameJp.Textの値を、for文を使わないで取得したいです。n=1000、k=1000と膨大になるため、実行速度が遅くなることを懸念しています。
for文を使わないで、値を取得するための知恵をかしていただけると幸いです。

Risposta accettata

Atsushi Ohashi
Atsushi Ohashi il 30 Set 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 Commenti
Atsushi Ohashi
Atsushi Ohashi il 2 Ott 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
Shinij Kumagai
Shinij Kumagai il 2 Ott 2020
ご教授いただき、誠にありがとうございます。無事に実行できました。

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su ループと条件付きステートメント in Help Center e File Exchange

Prodotti


Release

R2015a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!