質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

Q&A

解決済

1回答

5360閲覧

MSXML2.DomDocumentでXHTMLを処理できるか

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

0グッド

0クリップ

投稿2015/07/01 12:12

MS-Access VBAにてMSXML2.XMLHTTPを使ってwebサーバーにPOSTした結果を、MSXML2.DomDocumentで受けて処理しようとしています。
参照設定に、「Microsoft XML, v3.0」を加えています。

selectNodesメソッドを使って、特定の要素を読み出すというのを想定していて、こんなコードを書いています。

lang

1 (略) 2 Set xdoc = CreateObject("MSXML2.DOMDocument") 3 xdoc.async = False 4 xdoc.SetProperty "ServerHTTPRequest", True 5 xdoc.SetProperty "SelectionLanguage", "XPath" 6 7 result = xdoc.loadXML(HttpReq.responseText) 8 If result = False Then 9 ''(エラー処理、略) 10 End If 11 12 Set nodelist = xdoc.selectNodes("//div[@id='response']/p") 13

などとして、div要素のid属性にresponseを持った要素の下のp要素を特定したいのですが、ひっかからず、nodelist.lengthは常にゼロです。

SelectionLanguageをXPathにする行をコメントアウトして、

lang

1 Set nodelist = xdoc.selectNodes("/html/body/div/p")

などとするとかろうじて引っかかりますが、これだとXSLPatternってもので検索していることになるんでしょうか。

XMLやXPathに関する知識も付け焼き刃なので、何をどうしたら迷うところです。

1)webサーバーの応答を、完全にXMLで返す。(webブラウザでのデバッグどうするか?)
2)XSLPatternでもいいから、突き進む。
3)XPathで引っかかるように問題点を直す。
4)XMLパーサを使うのをやめて、HttpReq.responseTextをテキスト処理する。

XHTMLで返せば、webブラウザを使ってのデバッグもしやすいかなというところなので、なるべくXHTMLで返したいのですが、XMLパーサの使い方がわからないところもあり、難渋しています。

尚、webサーバーは既存のwebサービスからデータを引き出すものでなく、自前でこれから建てるものなので、プロトコル自体も調整できます。
仮に、FuelPHPで書いています。

何か間違っている箇所、点検するべきポイントなどありましたら、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結局、1)webサーバーの応答を、完全にXMLで返す、で取り組んでみることにしました。

webサーバーはFuelPHPにてRestコントローラーを使ってXML出力するようにしました。
Model_CrudクラスでDB問い合わせ結果を配列で取得したものを、XML出力出来ました。
例えばこんな感じ:

lang

1<result>ok</result> 2<content> 3 <item> 4 <field_1>foo</field_1> 5 <field_2>bar</field_2> 6 (略) 7 </item> 8 <item> 9 <field_1>baz</field_1> 10 <field_2>qux</field_2> 11 (略) 12 </item> 13 (略) 14</content>

MS-Access側は特に変えていません。
XPath式を使ってselectNodesメソッドにて目標要素を特定してデータ抽出できています。

lang

1rownum = 1 2Do Until xdoc.selectNodes("//content/item[" & CStr(rownum) & "]/field_1").Length = 0 3 field_1 = xdoc.selectNodes("//content/item[" & CStr(rownum) & "]/field_1").Item(0).Text 4 field_2 = xdoc.selectNodes("//content/item[" & CStr(rownum) & "]/field_2").Item(0).Text 5 (略) 6 rownum = rownum + 1 7Loop

webサーバーの応答のデバッグについては、応答テキストをXML解釈できるエディタにコピペして、
意図した構造になっているかをチェックすれば良さそうです。

投稿2015/07/03 01:44

編集2015/07/03 01:53
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問