XML構造体配列の複数Fieldの中のそれぞれのField格納されている要素の取得
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Shinij Kumagai
le 28 Sep 2020
Commenté : Shinij Kumagai
le 2 Oct 2020
構造体配列で、複数Fieldにまたがった下位配列の値を,for文を使わないで取得したいと考えています。
例えば、ChTable(n).Live.friutts.Ch(1,k).ChNameJp.Textの値を、for文を使わないで取得したいです。n=1000、k=1000と膨大になるため、実行速度が遅くなることを懸念しています。
for文を使わないで、値を取得するための知恵をかしていただけると幸いです。
0 commentaires
Réponse acceptée
Atsushi Ohashi
le 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 commentaires
Atsushi Ohashi
le 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
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur ループと条件付きステートメント dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!