関連記事の目次はこちら


お次は XMLファイルの内容を読み取る。しかし、読み取るには「ファイルの構造」を知っておく必要がある。

サンプルの場合
・<records>の下に<prefectural>が複数ある。
・<prefectural>の下に<name></name> と <capital></capital> がひとつずつある。
・<prefectural>は、id と area という属性を持つ。

である。

ということを念頭に、いくつか読み取りサンプルを書く。
ベースは前回のものに少し手を加えたものを使う。修正した箇所、更に使い回すため

Sub ReadXML()

Dim XDoc As MSXML2.DOMDocument
Dim Node As MSXML2.IXMLDOMNode ' 追加

Set XDoc = New MSXML2.DOMDocument

If XDoc.Load(ThisWorkbook.Path & "\sample01.xml") = False Then
' 読み込み失敗時
With XDoc.parseError
Debug.Print .errorCode & " / " & Replace(.reason, vbCrLf, "")
Debug.Print "行 :" & .Line & " , カラム :" & .linepos
Debug.Print "内容 :" & .srcText
Debug.Print ""
Debug.Print "ファイル(URL) :" & .URL
Debug.Print "ファイル先頭からの位置 :" & .filepos
End With

Exit Sub
End If

Debug.Print "読み込み成功"

'この行を、以下のサンプルコードと入れ替えて使用する

Set XDoc = Nothing

End Sub


早速始める。
県名の取得 -----------------------
まずは県名を順次取得する。県名は XML上、name としている。
県名は、records の下の prefectural の name の内容である。この場合、スラッシュで区切ってパスを示すとよい。records/prefectural/name てな具合である。
    For Each Node In XDoc.selectNodes("/records/prefectural/name")
Debug.Print Node.Text
Next

結果は

北海道
青森
鹿児島
沖縄

となる。

県庁所在地の取得 --------------------
県庁所在地の取得はこうなる。県庁所在地はXML上、capital としている。
    For Each Node In XDoc.selectNodes("/records/prefectural/capital")
Debug.Print Node.Text
Next

結果は

札幌
青森
鹿児島
那覇

となる。

県名も県庁所在地も関係なく取得 -------------
県名も県庁所在地も関係あるか!と言う場合はこういうこともできる。要するに、/records/prefectural/以下のものを順次見つけられればよいってことである。
    For Each Node In XDoc.selectNodes("/records/prefectural/*")
Debug.Print Node.Text
Next


結果は

北海道
札幌
青森
青森
鹿児島
鹿児島
沖縄
那覇

となる。


次回は、もう少しバリエーションを広げてみる。

関連記事の目次はこちら


お次は XMLファイルをとりあえず読み混む、という作業を行う。
内容を読む、というのは次のステップとする。

・XMLを読み込むためのブックを、任意のフォルダ、任意のファイル名で作成する。新規作成の場合、必ず一度は保存し、ファイルの実態を作成すること。また、参照設定も忘れていないかを確認すること。
・前回作成した sample01.xml を上記の[任意のフォルダ]に入れる。
・上記の任意のファイルのIDEでVBAのコードを書く。今回は標準モジュールを追加し、そこに書くことにしよう。

Sub ReadXML()

Dim XDoc As MSXML2.DOMDocument

Set XDoc = New MSXML2.DOMDocument

If XDoc.Load(ThisWorkbook.Path & "\sample01.xml") = False Then
' 読み込み失敗時
With XDoc.parseError
Debug.Print .errorCode & " / " & Replace(.reason, vbCrLf, "")
Debug.Print "行 :" & .Line & " , カラム :" & .linepos
Debug.Print "内容 :" & .srcText
Debug.Print ""
Debug.Print "ファイル(URL) :" & .URL
Debug.Print "ファイル先頭からの位置 :" & .filepos
End With

Exit Sub
End If

Debug.Print "読み込み成功"

Set XDoc = Nothing

End Sub


こんな感じ。

読み込みがうまくいけば「読み込み成功」が出るし、うまく行かなければエラーの原因が出る。
わざとエラーになるようにXMLを加工し、どういうエラーが出るかを試してみると、トラブル時の対応に強くなるのでお勧めする。

正常に読めることが確認できれば、次は内容の読み取りである。




昔、広告代理店の基幹システムに携わった際に、ヒッチハイク(HH)とカウキャッチャー(CC)という言葉を知った。
CCは番組が始まる前のCM、HHは番組終了後のCM、と言えば解りやすいだろう。

その昔、日経ビジネスに「映像メディアの世紀 ― ビデオ・男たちの産業史」という連載があった。題材は世に言う「ビデオ戦争」。VHSとベータの覇権争いである。ビデオは「タイムシフティングマシン」つまり、時間をずらすことのできる機器として売り出された。
今はハードディスクに録画する時代。DVDも規格云々で第二のVHS-ベータ戦争とも言われていたが、それは杞憂に終わったと言ってもいいかもしれない。


さて、今回は「広告の値段は平等か」。同じ時間枠でも「値段の差はあるのではないか?」という疑問を感じていたときのお話。

例えば21時からの放送を「録画」したとしよう。その番組、実は21:02からだったとすれば、その間はCMである。おそらくは「飛ばそう」と、飛ばすことが多くなるだろう。しかし、21時になりたてのCMと、本放送の直前のCMは、リモコンで飛ばされるCMよりも当然、目に付く。つまり、広告効果が高いということになり、広告料金も高くなる傾向がある、のではないかと容易に想像が付く。
広告代理店もそのあたり心得ていて、冠スポンサーなどにはそういう「いい時間」を割り当てる。当たり前と言えば当たり前のことである。

しかし、数年前にある団体(どういう団体か忘れましたが、○村総研のような大手だったことだけは覚えています)が「録画されると広告効果が低い」ような結果を出した。放送局も広告代理店もこの結果には異を唱えていたが、それは「反発しなければならなかった」のだろう。

昔、「TV広告は水商売」と広告代理店さんから聞いていた。原価や採算ラインがとか、考えなくてもよいのかもしれないが、そういう業態であった。
そのような状況下で、上記のように「広告効果が薄い」などと言われると非常に都合が悪い。顧客から引き下げ要求がありうるが、それに明確に答えられる論理がないからだ。

当時は大手の旧来の広告代理店でも電通と博報堂を除いてはインターネット広告をさほど重視していなかった頃だった。しかし、インターネット広告はテレビ、ラジオ、新聞、チラシといった従来のメディアと違ってクリック数や表示数などを数値で把握できるため、広告の効果の測定を行いやすく、ひいては投資額に対する効果を定量的に説明しやすい。特に通信販売であればそれがダイレクトに売り上げに連動する。