アプリ版:「スタンプのみでお礼する」機能のリリースについて

<?xml version="1.0" encoding="utf-8"?>
<customer>
<customer_no>123456</customer_no>
<last_name>山田</last_name>
<first_name>太郎</first_name>
</customer>
<customer>
<customer_no>154653</customer_no>
<last_name>山田</last_name>
</customer>


上記のようなxmlから、customer_no、last_name、first_nameをNodeListでEXCELに取得しております。
2番目のレコードにfirst_nameのデータがないので、first_nameというタグもありません。
NodeListでEXCELにはきだすと、データがない箇所は詰めて取得されるのでずれてしまいます。
データがない場合は空欄で取得させたいです。
どなか教えていただけますでしょうか?

A 回答 (1件)

こんにちは



ご質問文中に「nodeList」とあるので、XMLDOM経由で取得しているものと推測しました。

>NodeListでEXCELにはきだすと、データがない箇所は詰めて
>取得されるのでずれてしまいます。
必要項目が決まっているようですから、あらかじめ必要な分の箱を用意しておいてから、そこに要素の値を放り込むようにすれば良いのではないでしょうか?

以下は、Dictionaryオブジェクトを利用した例です。
必要項目は、仮に、ご例示の3項目として・・
 Set Dic = CreateObject("Scripting.Dictionary")
 ItemList = Array("customer_no", "last_name", "first_name")
などと設定しておき、

仮に、customerタグのnodeListが、変数customersに得られているとして・・
 For Each c In customers
  '必要項目を未入力に設定
  For Each r In ItemList: Dic(r) = "未入力": Next r

  '項目内の子要素をリストアップ
  For Each nd In c.ChildNodes: Dic(nd.nodeName) = nd.Text: Next nd

  '必要な項目を出力
  For Each r In ItemList: Debug.Print (r & " = " & Dic(r)): Next r
 Next c
のような感じでループすれば、抜けている項目は"未入力"として出力されます。
これを空欄にしたければ、初期設定で空白文字列にしておけば良いでしょう。

※ アプリケーションが不明なので、上では出力はDebug.Printにしてあります。
※ Textが長い場合は全部記録するとメモリの無駄なので、
  Dic.Exists(nd.nodeName)
 で判断して、不要な記録はスキップする方が良いかも知れません。
    • good
    • 0
この回答へのお礼

ありがとう

早々とご回答ありがとうございます。
これをヒントに試してみます。
また不明点ございましたら、ご質問させていただきます。

お礼日時:2024/01/17 22:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A