エンジニアが発信する【XML】の記事を集めました

エンジニアが作る最新ITブログ トップ>エンジニアの発信する【XML】

2009年09月02日

[dev][groovy]StreamingMarkupBuilderでXML宣言を出力(補足)

groovy.xml.StreamingMarkupBuilderのソースを見ると、”mkp.”の後にはyield/yieldUnescaped/xmlDeclaration/comment/piが使えることが分かります。さらに、StreamingMarkupBuilderはgroovy.xml.streamingmarkupsupport.AbstractStreamingBuilderを継承しているので、そこで定義されているdeclareNamespace/declareAlias/getName ...

2009年09月01日

[dev][groovy]StreamingMarkupBuilderでXML宣言を出力

前回のg*workshopでは「StreamingMarkupBuilderはXML宣言を出力してくれない」と言いましたが、実はありました。id:kskyさんからTwitterでやりかたを教えていただきましたのでメモ。 import java.nio.charset.* import groovy.xml.* def xml = new StreamingMarkupBuilder().bind{ mkp.xmlDeclaration() message("Hello World" ...

2009年08月20日

VBAでXMLを使う 体験:XMLファイル条件選択

関連記事の目次はこちら


今回は検索をしてみる。

ベースとするソースコードはこちらに書いたものを使い回す。

早速。
    For Each Node In XDoc.selectNodes("/records/prefectural/name[.='沖縄']")
Debug.Print Node.Text
Next

結果は

沖縄

となる。沖縄と同じテキストのものはこのひとつだから。

属性でも検索ができる。次のようなコードで。
    For Each Node In XDoc.selectNodes("/records/prefectural[@area='9']")
Debug.Print Node.Text
Next

結果は

鹿児島 鹿児島
沖縄 那覇

となる。


--------------------------------------

他の言語でのこととも書いたが、実はVBAでどうしてもXMLを使いたい状況になった、ということもあり、こういうネタを書いた。
更新等はそのうち書くとは思うが、これを使った別件に取りかかるため、XML系のネタは一旦これでお休みとする。

※並べ替えとか、面白そうなので簡単にできるなら、と思ったが、XSLを使った例しか見あたらなかったり・・。それってひとつ敷居が高かったりする・・。まだまだ勉強不足/情報不足なのだ。


表現が解りにくい等があればご連絡頂ければと思う。

2009年08月19日

VBAでXMLを使う 体験:XMLファイル読み取り3

関連記事の目次はこちら


今回は属性に関して。

ベースとするソースコードはこちらに書いたものを使い回す。

早速始める。
    For Each Node In XDoc.selectNodes("/records/prefectural/@id")
Debug.Print Node.XML
Next

結果は

01
02
46
47

となる。@を付けると、それは属性っていう決まりだそうな。

上記で @id を @area に変えるとエリアの情報が取れるが、@Area などとすると何も取れない。大文字と小文字は区別されている、ということになる。

属性と値を一緒に出すには次のようなコードで。
    For Each Node In XDoc.selectNodes("/records/prefectural")

Dim i As Integer
Dim Wk As String
Wk = ""
For i = 0 To Node.Attributes.Length - 1
Wk = Wk & Node.Attributes(i).baseName & ":" & Node.Attributes(i).Text & " , "
Next i
Wk = Left(Wk, Len(Wk) - 2)
Debug.Print Wk

Next

結果は

id:01 , area:1
id:02 , area:2
id:46 , area:9
id:47 , area:9

となる。

さて、次回はいよいよ検索に入っていこうと思う。

2009年08月18日

VBAでXMLを使う 体験:XMLファイル読み取り2

関連記事の目次はこちら


読み取りのバリエーションを増やしてみる。

ベースとするソースコードはこちらに書いたものを使い回す。


早速始める。
まずは例。
    For Each Node In XDoc.selectNodes("/records/prefectural")
Debug.Print Node.Text
Next

結果は

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

となる。

前回の最後と見比べていただくと、渡すパラメータは
前回:/records/prefectural/*
今回:/records/prefectural

と、/* があるかないか、の違いである。

さて、では「 / だけ残したらどうなる?」という疑問も湧くだろう。
/records/prefectural/
という場合だ。
    For Each Node In XDoc.selectNodes("/records/prefectural/")
Debug.Print Node.Text
Next

結果は、「DOMはノードを返しません」というエラーが発生した。残念ながら、これはNGである。




タグの名前も併せて取得 -----------------
これまで、いわば「内容」だけを取っていた。「項目」も見てみたい。
    For Each Node In XDoc.selectNodes("/records/prefectural")
Dim i As Integer
Dim Wk As String
Wk = ""
For i = 0 To Node.childNodes.Length - 1
Wk = Wk & Node.childNodes(i).nodeName & ":" & Node.childNodes(i).nodeTypedValue & " , "
Next i
Wk = Left(Wk, Len(Wk) - 2)

Debug.Print Wk
Next


この結果は

name:北海道 , capital:札幌
name:青森 , capital:青森
name:鹿児島 , capital:鹿児島
name:沖縄 , capital:那覇

となる。

今までは単にNodeという変数の Text プロパティを取得していただけだが、childNodes(n) ※言うまでもないが、nは変数。上記プログラムでFor文で変化しているもので、単なるアルファベットではない。の nodeName と nodeTypedValue を取得している。
childNodesの数だけ繰り返すので、全要素を出力することになる。


なお、プロパティでやたらと Node という綴り出てくる。ノード、というが「こぶ」とか「節」とかいう意味で、いまひとつピンとこない。
意味的にはclusterの方が理解しやすいのではないかと思う。その点、以下の書籍では上手に説明している。

XML-DB開発 実技コース (DB Magazine SELECTION)/下佐粉 昭

¥2,730
Amazon.co.jp


次回は、属性に触れる予定である。

2009年08月16日

XML関連 目次

小出しにしたので、検索エンジンでどのページがヒットするか解らない。よって、目次を作って順番に読んで行っていただければ「とりあえず使えるんじゃないか?」と用意した。

VBAでXMLを使う 
 準備
  参照設定
  XMLファイル
 体験
  XMLファイル読み込み
  XMLファイル読み取り1
  XMLファイル読み取り2 8/18 予定
  XMLファイル読み取り3 8/19 予定
  XMLファイル条件選択 8/20 予定
同じテーマの最新記事

2009年08月15日

Microsoft Math

数式をブラウザに簡単に出したいので、調べていたところこんなものを発見した。

Microsoft Math
http://www.microsoft.com/japan/athome/umall/math/

数式の意味を持たせたままWord2007で活用できるとか。これは面白そう。
XMLのようなマークアップ言語では現状表現が難しいとしても、これで画像が簡単にできるなら、まあいいか、というノリで試用。30日間は無料で使えるそうだ。ダウンロードして早速試す。

起動するとこんな感じ。


VBA 作法/コーディング規約 集約中  ( Excel Access 他)

関数電卓といったところか。

なんか「グラフ」ってのが気になったので、「グラフ」タブを選択し、なんとなく「方程式」を選んでみた。すると、式の入力例が載っていたので、それをコピー、貼り付けてみることにした。
まずはコピー対象を選択。
VBA 作法/コーディング規約 集約中  ( Excel Access 他)


で、式を入力するエリアをクリックし、出てきたダイアログにペーストした。
VBA 作法/コーディング規約 集約中  ( Excel Access 他)
ここで、数式のように変換されている。結構ステキ。

数式をエントリーしてもやはり数式風である。
VBA 作法/コーディング規約 集約中  ( Excel Access 他)

で、「グラフ」ボタンを押してみる。
VBA 作法/コーディング規約 集約中  ( Excel Access 他)
ちゃんとグラフが出た。


電卓とは違い、数式の保存なんかもできる。保存したファイルは、独自形式ではあるが、テキストファイルで、独自タグを使っているがXMLに似た形式である(XML宣言の代わりに他のモノが宣言されている・・)。

関数電卓風で、入力したものの表示が数式で出る、というところがいい。

個人的にもう少し遊んでみる。

同じテーマの最新記事

2009年08月14日

VBAでXMLを使う 体験:XMLファイル読み取り1

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

サンプルの場合
の下にが複数ある。
の下に がひとつずつある。
は、id と area という属性を持つ。

である。

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

Sub ReadXML()

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

Set XDoc = New MSXML2.DOMDocument

If XDoc.Load(ThisWorkbook.Path & "/\/isample01.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


結果は

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

となる。


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

2009年08月13日

VBAでXMLを使う 体験:XMLファイル読み込み

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

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

Sub ReadXML()

Dim XDoc As MSXML2.DOMDocument

Set XDoc = New MSXML2.DOMDocument

If XDoc.Load(ThisWorkbook.Path & "/\/isample01.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を加工し、どういうエラーが出るかを試してみると、トラブル時の対応に強くなるのでお勧めする。

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




同じテーマの最新記事

2009年08月11日

VBAでXMLを使う 準備:XMLファイル

で、お次にサンプルのXMLファイルを作る。
よく動物とか果物、野菜なんかをサンプルにすると、個人的に萎えてしまうので、都道府県にする。




北海道
札幌


青森
青森


鹿児島
鹿児島


沖縄
那覇


こんな感じ。面倒なので南北からそれぞれ2つ。これを sample01.xml とかいう名前で保存しておく。

次回はこれを読み込んでみよう。
同じテーマの最新記事

エンジニアが作る最新ITブログ トップ>エンジニアの発信する【XML】

メンバー紹介

タグパネル

ランキング

エンジニアが作る最新ITブログ DODA