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

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

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

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

Q&A

解決済

1回答

2751閲覧

VBAで以下の朝日新聞URLのXML要素を取得したいです

vbavba

総合スコア0

VBA

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

0グッド

1クリップ

投稿2020/06/07 03:35

編集2020/06/07 08:12

VBAで朝日新聞の以下のURLのXML要素を取得したいですが、何も取得されず困っています。
https://www.asahi.com/sitemap/sitemap_business.xml

Sub Main1()

'変数の宣言
Dim http As XMLHTTP60
Dim doc As DOMDocument60
Dim node As IXMLDOMNode
Dim url As String
Dim i As Integer

'HTTPアクセスを設定して発射
Set http = New XMLHTTP60
url = "https://www.asahi.com/sitemap/sitemap_business.xml"
http.Open "GET", url, False
http.send

'HTTPアクセスに失敗があったら中止
If http.Status <> 200 Then
MsgBox "サーバーへの接続に失敗しました", vbCritical
Exit Sub
End If

'XMLデータを取り込む
Set doc = New DOMDocument60
doc.LoadXML (http.responseText)

'XPathを使ってノード(要素)を取り込む
i = 1
For Each node In doc.SelectNodes("//urlset/url")
'各ノードのtitle属性を取得して、シートに貼り付ける
'ActiveSheet.Range("A" & i).Value = node.Attributes.getNamedItem("title").Text
i = i + 1
Next

'後片付け
Set http = Nothing
Set doc = Nothing
Set node = Nothing

End Sub

doc.SelectNodes("//urlset/url")のところに問題があると思いますが、
どのように書けばよいでしょうか。

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

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

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

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

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

Yasumichi

2020/06/07 03:41

/urlset/url に変更しても同様ですか?
vbavba

2020/06/07 07:02

ご回答ありがとうございます。 はい、、プログラム自体にエラーは出ないですが、何も取得されないです。 getNamedItem("title").Text もどこかまずいでしょうか。
sage

2020/06/07 07:10

1. どこで何が発生したか(何を期待していたか、どうなったか)、第三者に分かるように質問を修正してください。 2. 追試したいので使用した朝日新聞APIの仕様が書いてあるURLを教えてください。有料で、かつ現在は申込みを受け付けていないものしか簡単には見つかりませんでした。(もし有料のものを使っているのならば、サポートに尋ねたら?[有料でサポートなし?])
Yasumichi

2020/06/07 07:24

title ではなく news:title では?
vbavba

2020/06/07 07:39

sage様、 ご回答ありがとうございます。 2.につきましては、質問文中に書かせていただいたURLです。 https://www.asahi.com/sitemap/sitemap_business.xml (こちらはアクセスフリーです) この中で、 <news:news> <news:publication> <news:name>朝日新聞</news:name> <news:language>ja</news:language> </news:publication> <news:publication_date>2020-06-07T11:00:00+09:00</news:publication_date> <news:title>ウニ・毛ガニ・牛肉…コロナで北海道の高級食材が手頃に</news:title> <news:keywords>経済</news:keywords> </news:news> とあるので、 最終的には「朝日新聞」、「ja」、「2020-06-07T11:00:00+09:00」、「ウニ・毛ガニ・牛肉…コロナで北海道の高級食材が手頃に」、「経済」を取得したいです。 まずは一つだけでもいいので何か取得できればと思っていますが、 今のコードだと、何も取得できません。 エラーは出ないです。 よろしくお願いいたします。
vbavba

2020/06/07 07:46

Yasumichi様、早速ありがとうございます。 //urlset/url、/urlset/url、title、news:title 4通り試してみましたが、やはりエラーは出ないものの何も取得できない状況です。 PC設定の問題でしょうか。 参照設定では、 Visual Basic For Applications Microsoft Excel 16.0 Object Library OLE Automation Microsoft Office 16.0 Object Library Microsoft Forms 2.0 Object Library Microsoft XML v6.0 にチェックを入れています。
sage

2020/06/07 07:58

質問文中に書かれているものはAPIではないです。APIという記述は削除してください。 それで、どこまで動いているのか、確認し、教えてください。 (何を以てそこまでは動作したと判断したか、何を以てそこは動作していないと判断したか) それ以前を重点的に調べますから。
vbavba

2020/06/07 08:37 編集

失礼しました。 API削除いたしました。 ステップインで一つ一つ確認し、プログラムは一通り最後まで動いていますが、 セルは空のままで、何も取得しないです。 以下の部分はループしていませんでした。 For Each node In doc.SelectNodes("//urlset/url") '各ノードのtitle属性を取得して、シートに貼り付ける ActiveSheet.Range("A" & i).Value = node.Attributes.getNamedItem("title").Text i = i + 1 Next
guest

回答1

0

自己解決

doc.LoadXML (http.responseText)
のあとに、

   Dim post As Object

   For Each post In doc.getElementsByTagName("news:news")
r = r + 1
Cells(r, 1) = post.getElementsByTagName("news:title")(0).Text
Next

これで案外すんなり取得することができました。

お二方とも本当にありがとうございました。

投稿2020/06/08 09:49

vbavba

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問