VBScriptでXMLのデータを取得する方法

このQ&Aのポイント
  • VBSでXMLのデータを取得する方法について質問します。具体的には、XMLのtitleをpub idごとに別々に抽出する方法が知りたいです。
  • 現在、以下のコードを試しているのですが、titleが一つにまとめられてしまい、個別に抽出できません。pub idの階層が原因かもしれませんが、解決方法がわかりません。
  • アドバイスをお願いします!
回答を見る
  • ベストアンサー

VBScriptでXMLのデータを取得する方法

こんにちは。 プログラミング初心者です。どうぞよろしくお願いします。 VBSで下記のようなXMLのtitleをpub idごとに別々に分けて抽出したいのですが、どうしたらよいか全く分からない状態です。 <book> <publisher> <pub id="集英社"/> </publisher> <title>ドラゴンボール</title> </book> <book> <publisher> <pub id="講談社"/> </publisher> <title>はじめの一歩</title> </book> <book> <publisher> <pub id="集英社"/> </publisher> <title>ジョジョの奇妙な冒険</title> </book> <book> <publisher> <pub id="秋田書店"/> </publisher> <title>範馬刃牙</title> </book> 下記のリンク先サイトにあったコードを試したのですが、titleが一緒くたに抽出されてしまい、別々に抽出ができません。pub idの階層が一つ深いのが原因だと思うのですが・・・どうしたらよいのか、さっぱり思いつきません。 http://www.atmarkit.co.jp/fxml/rensai/msxml01/msxml03.html Dim objDOM, rtResult Set objDOM = WScript.CreateObject("MSXML2.DOMDocument") rtResult = objDOM.load("○○.xml") If rtResult = True Then procDispDatas objDOM.childNodes End If Set objDOM = Nothing Sub procDispDatas(objNode) Dim obj For Each obj In objNode If obj.nodeType = 3 and obj.parentNode.nodeName = "title" Then MsgBox obj.parentNode.nodeName & " : " & obj.nodeValue End If If obj.hasChildNodes Then procDispDatas obj.childNodes End If Next End Sub どうかアドバイスをよろしくお願いいたします!

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

XMLファイルのルートノードを追加したほうがいいように思います 出発点のノードが1つでそこから枝分かれするようにします 今回なら <book>タグの外側に<books>タグを追加します <books> <book> <publisher> <pub id="集英社"/> </publisher> <title>ドラゴンボール</title> </book> <book> <publisher> <pub id="講談社"/> </publisher> <title>はじめの一歩</title> </book> <book> <publisher> <pub id="集英社"/> </publisher> <title>ジョジョの奇妙な冒険</title> </book> <book> <publisher> <pub id="秋田書店"/> </publisher> <title>範馬刃牙</title> </book> </books> と行った具合でやってみましょう また先頭に XMLのバージョンやエンコード方式も追加した方がいいように思います <?xml version="1.0" encoding="shift_jis" ?> といった具合です

renounce
質問者

お礼

アドバイスありがとうございます。 返事が遅くなってしまってすみませんでした! いろいろ試してなんとかうまくいきました。 ありがとうございました!

関連するQ&A

  • VBSでXMLを読込、検索結果をテキスト出力

    VBSのソースについてご教授下さい。 【作りたい機能】 XMLファイルを読み込み、任意のエレメントを検索するスクリプトを VBSで作成しようとしています。 【状況】 ダイアログで表示させる方法はわかりました。  参照  http://www.atmarkit.co.jp/fxml/rensai/msxml01/msxml03.html 01 : Dim objDOM, rtResult 02 : 03 : Set objDOM = WScript.CreateObject("MSXML2.DOMDocument") 04 : rtResult = objDOM.load("Sample.xml") 05 : If rtResult = True Then 06 : procDispDatas objDOM.childNodes 07 : End If 08 : Set objDOM = Nothing 09 : 10 : Sub procDispDatas(objNode) 11 : Dim obj 12 : For Each obj In objNode 13 : If obj.nodeType = 3 and obj.parentNode.nodeName = "title" Then 14 : MsgBox obj.parentNode.nodeName & " : " & obj.nodeValue 15 : End If 16 : If obj.hasChildNodes Then 17 : procDispDatas obj.childNodes 18 : End If 19 : Next 20 : End Sub この結果をテキストファイルに出力させる方法に 困っております。 どこにどのように記載すればいいか 教えていただきたく存じます。 よろしくお願いいたします

  • VBScriptを用いたXMLのデータ抽出に関して

    下記のsample.xmlから sample.xml ---------------------------------------------- <?xml version="1.0" encoding="utf-8" ?> <books> <item> <title>XML入門-第1巻</title> <price>2500</price> <isbn>1-1234-5678-X</isbn> <authors> <author>西谷 亮</author> </authors> <imgfile>1-1234-5678-X.gif</imgfile> </item> <item> <title>XML入門-第2巻</title> <price>2200</price> <isbn>1-1234-5678-0</isbn> <authors> <author>西谷 亮</author> <author>山田 太郎</author> </authors> <imgfile>1-1234-5678-0.gif</imgfile> </item> <item> <title>XML入門-第3巻</title> <price>3600</price> <isbn>1-1234-5678-1</isbn> <authors> <author>西谷 亮</author> <author>鈴木 次郎</author> </authors> <imgfile>1-1234-5678-1.gif</imgfile> </item> </books> ---------------------------------------------- 下記のtitle.vbsを用いて、「<title>」タグに表記された 書物のタイトルだけを抜き出します。 title.vbs ---------------------------------------------- 01 : Dim objDOM, rtResult 02 : 03 : Set objDOM = WScript.CreateObject("MSXML2.DOMDocument") 04 : rtResult = objDOM.load("Sample.xml") 05 : If rtResult = True Then 06 : procDispDatas objDOM.childNodes 07 : End If 08 : Set objDOM = Nothing 09 : 10 : Sub procDispDatas(objNode) 11 : Dim obj 12 : For Each obj In objNode 13 : If obj.nodeType = 3 and obj.parentNode.nodeName = "title" Then 14 : MsgBox obj.parentNode.nodeName & " : " & obj.nodeValue 15 : End If 16 : If obj.hasChildNodes Then 17 : procDispDatas obj.childNodes 18 : End If 19 : Next 20 : End Sub ---------------------------------------------- 上記の記述ではサブプロシージャprocDispDatas(objNode) にて、<title>タグの要素の数だけMsgBoxでタイトル名の メッセージボックスが表示されるかと思います。 これをひとつのメッセージでまとめるて表示するはどのように 記述すればよいでしょうか。 下記のメッセージの表示が理想です。 メッセージ ---------------------------------------------- title:XML入門-第1巻 title:XML入門-第2巻 title:XML入門-第3巻 ---------------------------------------------- お手数をおかけしますが、ご存知の方 ご教授いただけませんでしょうか>< よろしくお願いいたします。

    • 締切済み
    • XML
  • EXCELVBA XML処理

    こんにちは、 下記のプログラムを作成したのですが、 (すいません、わかりづらいかもしれません。) <DIMENSION Name="E1">内の<HIERARCHY>タグ内にある <PARENT>と<CHILD>の値をセルに貼り付けようとしているのですが、 現在、下記二点で悩んでいまして、何か方法などありましたらお願い致します。 1:<DIMENSION Name="E1">処理のときに、セルにNAMEの値E1を出力  しているのですが、二回表示されてしまう。  (おそらく、<MEMBERS>と<HIERARCHY>と二つタグがあるので  そのせいかと思ったのですが、回避方法が変わりません。) 2:<DIMENSION Name="E1">だけでよいのだが、  <DIMENSION Name="Z1">まで処理を行っている  (<DIMENSION Name="E1">を抜けたという判断方法がわからず・・) VBAコード----------- Option Explicit Dim ia As Long Dim flg As Integer Private Sub CommandButton2_Click() Const cnsTITLE = "テキストファイル読み込み処理" Const cnsFILTER = "全てのファイル (*.*),*.*" Dim xlAPP As Application ' Applicationオブジェクト Dim strXMLFile As String Dim objDOM As MSXML2.DOMDocument Dim rtResult Set xlAPP = Application xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" strXMLFile = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _ Title:=cnsTITLE) If StrConv(strXMLFile, vbUpperCase) = "FALSE" Then Exit Sub Set objDOM = New MSXML2.DOMDocument rtResult = objDOM.Load(strXMLFile) If rtResult = True Then ia = 0 flg = 0 procDispDatas objDOM.childNodes Else MsgBox "読み込み失敗" End If Set objDOM = Nothing End Sub Sub procDispDatas(objNode) Dim obj For Each obj In objNode If (obj.parentNode.nodeName = "DIMENSION") Then '<DIMENSION >タグ内処理か判断 If (obj.parentNode.Attributes.getNamedItem("Name").nodeValue = "E1") Then '<DIMENSION Name="E1">タグ内処理か判断 ia = ia + 1 Cells(ia, 1).Value = _ obj.parentNode.Attributes.getNamedItem("Name").nodeValue & " : " flg = 1 End If ElseIf (flg = 1) Then If (obj.parentNode.nodeName = "HIERARCHY") Then '<HIERARCHY>タグ内処理か判断 flg = 2 End If ElseIf (flg = 2) Then If (obj.parentNode.nodeName = "NODE") Then '<NODE>タグ内処理か判断 flg = 3 End If ElseIf (flg = 3) Then Select Case obj.parentNode.nodeName Case "PARENT" '<PARENT>タグ内処理か判断 ia = ia + 1 Cells(ia, 1).Value = _ obj.parentNode.nodeName & " : " & _ obj.nodeValue Case "CHILD" '<CHILD>タグ内処理か判断 ia = ia + 1 Cells(ia, 1).Value = _ obj.parentNode.nodeName & " : " & _ obj.nodeValue Case Else End Select End If If obj.hasChildNodes Then procDispDatas obj.childNodes End If Next End Sub XMLファイル---------- <?xml version = "1.0" encoding="UTF-16" ?> <HSDATA> <DIMENSION Name="E1"> <MEMBERS> <MEMBER> <LABEL>[None]</LABEL> <AT Name="DefCurrency">[None]</AT> <DESCRIPTION Language="English">[None]</DESCRIPTION> </MEMBER> </MEMBERS> <HIERARCHY> <NODE> <PARENT>#root</PARENT> <CHILD>[None]</CHILD> </NODE> <NODE> <PARENT>#root</PARENT> <CHILD>MNG_CN</CHILD> </NODE> </HIERARCHY> </DIMENSION> <DIMENSION Name="Z1"> <HIERARCHY> <NODE> <PARENT>abc</PARENT> <CHILD>123</CHILD> </NODE> <NODE> <PARENT>def</PARENT> <CHILD>456</CHILD> </NODE> </HIERARCHY> </DIMENSION> </HSDATA>

  • xmlのデータ取得方法について

    WshでXMLの取り込みをしているのですが、あるタグにくるとエラーが出ます。 どのように処理をすればよろしいのでしょうか? ■ ソース(抜粋) objNode.Load("ファイル名") For Each tmp In objNode.getElementsByTagName("東京都") For Each tmp2 In tmp.ChildNodes If tmp2.hasChildNodes Then For Each tmp3 In tmp2.getElementsByTagName("新宿区") For Each tmp4 In tmp3.ChildNodes If tmp4.nodeName = "AAA" Then n1 = tmp4.firstChild.nodeValue End If If tmp4.nodeName = "BBB" Then n2 = tmp4.firstChild.nodeValue End If Next Next End If Next Next ■ XMLデータ <東京都> <新宿区> <AAA> "大人の町" </AAA> <BBB /> <----------この形式のタグでエラーが出ます。 </新宿区> </東京都> <BBB />は、値が無いので、firstChildではエラーになるみたいです。("tmp4.firstChildはオブジェクトがありません。"とでます。) 以上ご教授よろしくお願いします。

  • VBAでxmlから特定の文字を変数に入れたい

    VBAからXMLを取得したくて方法を検索し、以下のコードで何とか取得ができました。 Sub httpRequest() Dim HttpReq As MSXML2.XMLHTTP Dim DomDoc As MSXML2.DOMDocument Dim targetURL As String targetURI = "http://www.drk7.jp/weather/xml/14.xml" 'HTTP GET Set HttpReq = CreateObject("MSXML2.XMLHTTP") HttpReq.Open "GET", targetURI, False HttpReq.send (Null) 'XML PARSE Set DomDoc = CreateObject("MSXML2.DOMDocument") DomDoc.LoadXML (HttpReq.responseText) dumpDomDoc DomDoc.ChildNodes Set HttpReq = Nothing Set DomDoc = Nothing End Sub Sub dumpDomDoc(objNode) Dim obj For Each obj In objNode MsgBox obj.ParentNode.nodeName & " : " & obj.NodeValue If obj.HasChildNodes Then dumpDomDoc obj.ChildNodes End If Next End Sub このコードですと、読み込んだXMLを一行づつメッセージボックスに延々と表示するだけなのですが、 例えば行先のXMLファイルにある<description>と</description>に囲まれた部分だけを変数に格納するにはどのように記述すればよろしいのでしょうか? ググってはみましたが知識不足の為、解説も理解できず困っております。 大変お手数ですがご教示いただけますようお願いします。

  • XMLをエクセルに取り込むマクロその2

    以下のtest2.xmlを <?xml version="1.0" encoding="UTF-8" ?> <McXMLRoot> <McXMLData> <McXMLPageInfo> <page>1</page> <overLay></overLay> <partition>PAGE</partition> </McXMLPageInfo> <McXMLPageData> <現頁> <value>0001</value> </現頁> <作成日付> <value>平成21年 6月 1日現在</value> </作成日付> <Group0001> <氏名> <value>あああ</value> </氏名> <生年月日> <value>昭和48年 2月21日</value> </生年月日> </Group0001> <Group0002> </Group0002> <Group0003> </Group0003> </McXMLPageData> <McXMLPageInfo> <page>2</page> <overLay></overLay> <partition>PAGE</partition> </McXMLPageInfo> <McXMLPageData> <現頁> <value>0004</value> </現頁> <作成日付> <value>平成21年 6月 1日現在</value> </作成日付> <Group0001> <氏名> <value>いいい</value> </氏名> <生年月日> <value>昭和55年 12月5日</value> </生年月日> </Group0001> <Group0002> <法人名> <value>AAA株式会社</value> </法人名> <住所> <value>AA市1丁目1番地</value> </住所> </Group0002> <Group0003> <支店名> <value>BBB営業所</value> </支店名> </Group0003> </McXMLPageData> </McXMLData> </McXMLRoot> を読むマクロ↓ Public Const XmlPass = "D:\temp\test2.xml" Public y As Integer Public ctr As Long Public Sub Auto_Open() 'On Error Resume Next Workbooks.OpenXML Filename:= _ XmlPass _ , LoadOption:=xlXmlLoadImportToList Range("A1").Select Call RetsuSakujo Call parseXML End Sub Private Sub RetsuSakujo() ctr = 1 Do Until "" = Trim(Worksheets("sheet1").Cells(1, ctr)) If "eform" = Trim(Worksheets("sheet1").Cells(1, ctr)) Or _ "page" = Trim(Worksheets("sheet1").Cells(1, ctr)) Or _ "overLay" = Trim(Worksheets("sheet1").Cells(1, ctr)) Or _ "partition" = Trim(Worksheets("sheet1").Cells(1, ctr)) Then Worksheets("sheet1").Columns(ctr).EntireColumn.Delete ctr = 0 End If ctr = ctr + 1 Loop End Sub Private Sub parseXML() Dim objDOM, rtResult y = 1 Set objDOM = CreateObject("MSXML2.DOMDocument") rtResult = objDOM.Load(XmlPass) If rtResult = True Then Call setTitle(objDOM.childNodes) End If Set objDOM = Nothing End Sub Sub setTitle(objNode) Dim obj For Each obj In objNode If obj.hasChildNodes Then If obj.parentNode.nodeName <> "McXMLRoot" And _ obj.parentNode.nodeName <> "McXMLData" And _ obj.parentNode.nodeName <> "McXMLPageData" And _ obj.parentNode.nodeName <> "McXMLPageInfo" _ Then If SearchChild(obj.childNodes) = False Then If y >= ctr Then Exit Sub End If Cells(1, y).Value = obj.parentNode.nodeName y = y + 1 End If End If Call setTitle(obj.childNodes) End If Next End Sub Private Function SearchChild(objNode) As Boolean Dim obj For Each obj In objNode If obj.hasChildNodes Then SearchChild = True Else SearchChild = False End If Next End Function を作成してエクセルマクロを試したところ、 タイトルが 現頁,作成日付,氏名,生年月日,現頁2,作成日付2,氏名2,生年月日2,法人名 となります。が、本当は 現頁,作成日付,氏名,生年月日,法人名,住所,口座番号,口座名義人,支店名 としたいのです。(エクセルでXMLソースを表示した時の順序) なにかよい方法があれば教えてください。 よろしくお願いします。

  • XMLファイルのattribute値がうまく取得できません。。

    ASP(VBScript)内の処理でwebからXMLファイルをLoadし、 そこからattribute値を取得しようとしているのですが、 どうもうまくいきません。。 XMLファイルのデータ取得自体はうまく出来ています。 -------------------------------------- ' 以下、LoadしたXML本文です。 <?xml version="1.0" encoding="Shift-JIS"?> <info> <title>タイトル1</title> <text no="100"> <--この100が取得したい <note>本文1</note> </text> <text no="200"> <--この200が取得したい <note>本文2</note> </text> <title>タイトル2</title> <text no="100"> <--この100が取得したい <note>本文1</note> </text> <text no="200"> <--この200が取得したい <note>アナログ本文</note> </text> </info> ' 以下、VBScript本文です <% language = "VBscript" %> <% dim objXml Set objXml = Server.CreateObject("Microsoft.XMLDOM") objXml.load("http://localhost/text.xml") Call Disp(objXml.childNodes) Public Sub Disp(ByRef Nodes) Dim cNode For Each cNode In Nodes If cNode.parentNode.nodeName = "text" Then If Not cNode.attributes Is Nothing Then response.write cNode.getAttribute("no") '<-- 表示されない。。 End If End If Next End Sub %> -------------------------------------- 最終的にやりたい事としては、 DBから text no を取得して、その no が一致したものを表示、 といった事をやりたいと考えています。 (完全に不一致の場合は、タイトルも表示させない) 取り急ぎ、表示されない理由がどなたかお分かりでしたら ご教授願えないでしょうか・・・? 以上、よろしくお願いいたします。

  • VBscriptでXMLデータの抽出に関する質問

    教えて下さい。以下のようなXMLファイルがあります。 <?xml version="1.0" encoding="Shift-JIS"?> <ROOT> <INFO> <NO>0001</NO> <NAME>ABC</NAME> <COMMENT> </COMMENT> <AGE>30</AGE> </INFO> </ROOT> これを以下のようにVBScriptにてデータを取り出したいです。 Dim DOM, docRoot, node, nodeList, i, m Dim objADO, objADO2 Dim objRS Dim sqlstmt, strSQL Dim no, comment 'DOMオブジェクト生成 Set DOM = CreateObject("Microsoft.XMLDOM") '同期モード DOM.async = True 'XMLを読み込む DOM.load("11.xml") 'ルートセット Set docRoot = DOM.documentElement 'ノードの設定 Set nodeList = docRoot.selectNodes("/ROOT/INFO") 'ループ For Each node In nodeList For i = 0 to node.ChildNodes.length - 1 Select case node.childNodes(i).nodeName case "NO" no = node.childNodes(i).firstChild.nodeValue case "COMMENT" comment = node.childNodes(i).firstChild.nodeValue End select Next Next ところがCOMMENTタグのようにデータが空のものがあると 「オブジェクトがありません」とエラーになります。 if Not IsNull(node.childNodes(i).firstChild.nodeValue) then というようにもやってみましたが、これでも同じエラーとなってしまいます。 何か方法はないでしょうか?アドバイスを宜しくお願いします。

    • ベストアンサー
    • XML
  • エクセルVBA Web上のフォームのIDを知る方法

     今晩は,質問させていただきます.どうぞよろしくお願いいたします.  エクセルVBAでWeb上のテキストボックスに文字を入力→ボタンを押す といった作業をいたしたく検索をしておりますと、以下のようなコードを書いてくださってておりました。 (http://billboardtop100.net/2011/03/dim-objie-as-object-dim-obj-as-object.htmlからの転載になります)   If Obj.ID = "searchText" Then     Obj.Value = "任天堂"   Else     If Obj.ID = "searchButton" Then       Obj.Click       Exit For     End If   End If  全てうまくうごき、非常に理解しやすいコードなのでございますが、これらフォームの「ID」を予めどのようにして調べらるのでございましょうか??  もしお詳しい方がいらっしゃいましたら,アドバイスいただきたくどうぞお願いいたします。

  • TRタグの入れ子におけるchildNodesの使い方

    Javascriptにおいて、TRタグが入れ子状態になっている時に、 「childNodes」で子供のTRタグを取得することはできないので しょうか?具体的には、以下のようなスクリプトを組んだ場合に、 c_obj_list[3] には子供のTRタグが格納されるのかと思ったのです が、そうはならないようです。子供のTRタグ配下のタグに操作を 行いたいのですが、どうやったら子供のTRタグ配下のタグに辿り 着くでしょうか? ****************************** <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS"></meta> <title></title> <script> function func(obj){ var p_obj=obj.parentNode; var pp_obj=p_obj.parentNode; var c_obj_list=pp_obj.childNodes; alert("c0="+c_obj_list[0].nodeName); alert("c1="+c_obj_list[1].nodeName); alert("c2="+c_obj_list[2].nodeName); alert("c3="+c_obj_list[3].nodeName); } </script> </head> <body> <table col="4"> <tr> <td><input type="checkbox" onclick="func(this)"/></td> <td colspan="2"><textarea style="width:298px;overflow:hidden;">あああ</textarea></td> <td><textarea style="width:300px;overflow:hidden;" >いいい</textarea></td> <tr> <td width="20"></td> <td><input type="checkbox" onclick="func(this)"/></td> <td><textarea style="width:274px;overflow:hidden;">ううう</textarea></td> <td><textarea style="width:300px;overflow:hidden;" >えええ</textarea></td> </tr> </tr> </table> </body> </html>

専門家に質問してみよう