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>
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 ですよん♪
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 ですよん♪
「Condition」と「Amount」はひもづけて取り出したいです。
また、「Offer」ブロックはここでは2つですが、増減します。
説明不足で申し訳ありません。
回答に追記しました。
「Condition」と「Amount」はひもづけて取り出したいです。
また、「Offer」ブロックはここでは2つですが、増減します。
さしあげるポイントは「100ポイント」ではなく、「300ポイント」に変更いたします。
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
XPathは全然知りませんでした。
今後の参考させていただきます。ありがとうございました!
「Condition」と「Amount」はひもづけて取り出したいです。
2014/01/27 10:57:08また、「Offer」ブロックはここでは2つですが、増減します。
説明不足で申し訳ありません。
回答に追記しました。
2014/01/27 23:47:57