XML構造体配列の複数Fieldの中のそれぞれのField格納されている要素の取得
7 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Shinij Kumagai
el 28 de Sept. de 2020
Comentada: Shinij Kumagai
el 2 de Oct. de 2020
構造体配列で、複数Fieldにまたがった下位配列の値を,for文を使わないで取得したいと考えています。
例えば、ChTable(n).Live.friutts.Ch(1,k).ChNameJp.Textの値を、for文を使わないで取得したいです。n=1000、k=1000と膨大になるため、実行速度が遅くなることを懸念しています。
for文を使わないで、値を取得するための知恵をかしていただけると幸いです。
0 comentarios
Respuesta aceptada
Atsushi Ohashi
el 30 de Sept. de 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 comentarios
Atsushi Ohashi
el 2 de Oct. de 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
Más respuestas (0)
Ver también
Categorías
Más información sobre 構造化データと XML ドキュメント en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!