6

私は次のことに少しこだわっています。VBAを使用してローカル銀行のWebサイトからExcelに為替レートを取得しようとしています。主にXML解析の練習のために、これが私の最初の真剣な試みだと思います。

数時間グーグルして関連するSOの質問を読んだ後、私は多かれ少なかれ実用的な解決策を得ましたが、より良いXMLの控えめな表現のためにそれを最適化したいと思います。これまでのところ、問題は次のとおりです。

<LIST_RATE>
    <RATE ISO="EUR" Code="978">
        <TITLE>Евро</TITLE>
        <CODE>978</CODE>
        <ISO>EUR</ISO>
        <DATE>Thu, 31 Jan 2013 09:00:00 GMT</DATE>
        <BUY>11550.0000</BUY>
        <SELL>11820.0000</SELL>
        <QUANTITY>1</QUANTITY>
    </RATE>
    <RATE ISO="RUB" Code="643">
        <TITLE>Российский рубль</TITLE>
        <CODE>643</CODE>
        <ISO>RUB</ISO>
        <DATE>Thu, 31 Jan 2013 09:00:00 GMT</DATE>
        <BUY>279.0000</BUY>
        <SELL>292.0000</SELL>
        <QUANTITY>1</QUANTITY>
    </RATE>
    <RATE ISO="USD" Code="840">
        <TITLE>Доллар США</TITLE>
        <CODE>840</CODE>
        <ISO>USD</ISO>
        <DATE>Thu, 31 Jan 2013 09:00:00 GMT</DATE>
        <BUY>8570.0000</BUY>
        <SELL>8710.0000</SELL>
        <QUANTITY>1</QUANTITY>
    </RATE>
</LIST_RATE>

上記のXML部分の場合(念のため-これは完全なXMLへのリンクです:http ://www.priorbank.by/CurratesExportXml.axd?channel = 9)次のコードを使用してRATEノードの子ノードをループしています:LIST_RATE

For Each RATE_Node In LIST_RATE_Node.ChildNodes
    CurrencyCode = RATE_Node.ChildNodes.Item(2).Text 'ISO node
    RateValue = CSng(Replace(RATE_Node.ChildNodes.Item(4).Text, ".", ",")) 'BUY node
    [rest of code]
Next

コードは正常に機能していますが、の代わりに名前を使用して、RATEノードの子ノードを何らかの方法で選択したいと思いますItem(#)。試しselectSingleNodeましたが、XPathにまったく精通しておらず、使用した表記は常に最初の<RATE ISO="EUR" Code="978">値を返しました。getElementsByTagNameノードの束全体を返します。

関連するSOの質問をたくさん読みましたが、それでも行き詰まりました。解決策は単純だと確信しています。すべての目的を達成する必要があります。正しい方向へのアドバイスやガイダンスは大歓迎です。前もって感謝します!

4

1 に答える 1

11
    Option Explicit

    Private Const xml As String = "<LIST_RATE>" & _
        "<RATE ISO='EUR' Code='978'>" & _
            "<TITLE>????</TITLE>" & _
            "<CODE>978</CODE>" & _
            "<ISO>EUR</ISO>" & _
            "<DATE>Thu, 31 Jan 2013 09:00:00 GMT</DATE>" & _
            "<BUY>11550.0000</BUY>" & _
            "<SELL>11820.0000</SELL>" & _
            "<QUANTITY>1</QUANTITY>" & _
        "</RATE>" & _
    "</LIST_RATE>"

    Sub test()
        Dim xmlDocument As MSXML2.DOMDocument60
        Set xmlDocument = New DOMDocument60

        If Not xmlDocument.LoadXML(xml) Then
            Err.Raise xmlDocument.parseError.ErrorCode, , xmlDocument.parseError.reason
        End If

        Dim listRateNode As IXMLDOMNode
        Dim rateNode As IXMLDOMNode
        Dim isoNode As IXMLDOMNode
        For Each listRateNode In xmlDocument.ChildNodes
            For Each rateNode In listRateNode.ChildNodes
                Set isoNode = rateNode.SelectSingleNode("ISO")
            Next
        Next

        Set isoNode = Nothing
        Set isoNode = xmlDocument.SelectSingleNode("/LIST_RATE/RATE[ISO='EUR']/ISO")
    End Sub

SelectSingleNodeが機能するはずです。SelectSingleNodeがRATE_NODEで使用されている場合は、。だけを使用しrateNode.SelectSingleNode("ISO")ます。xml-documentで、uはxmlDocument.SelectSingleNode("/LIST_RATE/RATE[ISO='EUR']/ISO")値EURのisoノードを見つけるために使用できます。これはあなたにとって役に立ちますか?

于 2013-02-02T23:09:31.407 に答える