ExcelのVBAのおける、XMLの取り扱いについて。


ExcelのVBAで、下記のようなXMLを取扱います。

for文で、すべての「Condition」要素と、
「Amount」要素を取り出したいのですが、どうしたらよいでしょうか。

例えば、要素が1つしかない「TotalOffers」なら、以下の様に書けばOKでした。

Set Offers = xml_data.selectSingleNode("Offers")
Offers.getElementsByTagName("TotalOffers")(0).Text

「Condition」要素と、「Amount」要素は、複数あるのでアクセス方法が分かりません。

◆対象のXML

<Offers>
<TotalOffers>2</TotalOffers>
<TotalOfferPages>1</TotalOfferPages>
<Offer>
<OfferAttributes>
<Condition>New</Condition>
</OfferAttributes>
<OfferListing>
<Price>
<Amount>2100</Amount>
<CurrencyCode>JPY</CurrencyCode>
<FormattedPrice>¥ 2,100</FormattedPrice>
</Price>
<Availability>在庫あり。</Availability>
</OfferListing>
</Offer>
<Offer>
<OfferAttributes>
<Condition>Used</Condition>
</OfferAttributes>
<OfferListing>
<Price>
<Amount>800</Amount>
<CurrencyCode>JPY</CurrencyCode>
<FormattedPrice>¥ 800</FormattedPrice>
</Price>
<Availability>通常1~2営業日以内に発送</Availability>
</OfferListing>
</Offer>
</Offers>

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/01/29 02:54:44
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント333pt

For Each で回すとか、

  Set Amounts = xml_data.getElementsByTagName("Amount")
  For Each e In Amounts
    MsgBox e.Text
  Next

For で回すとか。

  Set Amounts = xml_data.getElementsByTagName("Amount")
  For i = 0 To Amounts.Length - 1
    MsgBox Amounts(i).Text
  Next



追記です。

「Condition」と「Amount」はひもづけて取り出したいです。
また、「Offer」ブロックはここでは2つですが、増減します。

では、こんな感じで。

  Set offer = xml_data.getElementsByTagName("Offer")
  For Each e In offer
    Set amount = e.getElementsByTagName("Amount")
    Set condition = e.getElementsByTagName("Condition")
    MsgBox amount(0).Text
    MsgBox condition(0).Text
  Next

Offer 要素を取り出して、For Each で回し、その下にある Amount と Condition を getElementsByTagName() メソッドで取り出してます。
Offer の下に、Amount や Condition がひとつだけだというのを前提にしてます。

# ポイントは 100pt でも、全然 OK ですよん♪

id:tetlis

「Condition」と「Amount」はひもづけて取り出したいです。
また、「Offer」ブロックはここでは2つですが、増減します。
説明不足で申し訳ありません。

2014/01/27 10:57:08
id:a-kuma3

回答に追記しました。

2014/01/27 23:47:57

その他の回答1件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント333pt

For Each で回すとか、

  Set Amounts = xml_data.getElementsByTagName("Amount")
  For Each e In Amounts
    MsgBox e.Text
  Next

For で回すとか。

  Set Amounts = xml_data.getElementsByTagName("Amount")
  For i = 0 To Amounts.Length - 1
    MsgBox Amounts(i).Text
  Next



追記です。

「Condition」と「Amount」はひもづけて取り出したいです。
また、「Offer」ブロックはここでは2つですが、増減します。

では、こんな感じで。

  Set offer = xml_data.getElementsByTagName("Offer")
  For Each e In offer
    Set amount = e.getElementsByTagName("Amount")
    Set condition = e.getElementsByTagName("Condition")
    MsgBox amount(0).Text
    MsgBox condition(0).Text
  Next

Offer 要素を取り出して、For Each で回し、その下にある Amount と Condition を getElementsByTagName() メソッドで取り出してます。
Offer の下に、Amount や Condition がひとつだけだというのを前提にしてます。

# ポイントは 100pt でも、全然 OK ですよん♪

id:tetlis

「Condition」と「Amount」はひもづけて取り出したいです。
また、「Offer」ブロックはここでは2つですが、増減します。
説明不足で申し訳ありません。

2014/01/27 10:57:08
id:a-kuma3

回答に追記しました。

2014/01/27 23:47:57
id:tetlis

「Condition」と「Amount」はひもづけて取り出したいです。

また、「Offer」ブロックはここでは2つですが、増減します。

さしあげるポイントは「100ポイント」ではなく、「300ポイント」に変更いたします。

id:cx20 No.2

回答回数607ベストアンサー獲得回数108

ポイント100pt

XPath 形式で書いてみました。

Option Explicit

Sub ShowXmlData()
    Dim xml_data
    Set xml_data = CreateObject("Msxml2.DOMDocument.6.0")
    xml_data.Load "sample.xml"
    
    Dim cond
    Dim amt
 
    Dim nodes
    Set nodes = xml_data.SelectNodes("/Offers/Offer")

    Dim node
    For Each node In nodes
        Set cond = node.SelectSingleNode("OfferAttributes/Condition")
        Set amt = node.SelectSingleNode("OfferListing/Price/Amount")
        Debug.Print "Condition = [" & cond.Text & "], Amount = [" & amt.Text & "]"
    Next
End Sub
<実行結果>
Condition = [New], Amount = [2100]
Condition = [Used], Amount = [800]

<参考情報>
■ MSXML DOM の SelectNodes メソッドで XPath クエリを使用する方法
http://support.microsoft.com/kb/288913/ja

id:tetlis

XPathは全然知りませんでした。

今後の参考させていただきます。ありがとうございました!

2014/01/29 02:53:52

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません