我有点陷入以下困境:我尝试使用VBA从本地银行网站获取货币汇率 - 主要用于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问题,但仍然坚持。我很确定解决方案很简单 - 我只需要满足所有目标。任何对正确方向的建议或指导都将受到高度赞赏。提前谢谢!
答案 0 :(得分:9)
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应该可以工作。如果在RATE_NODE上使用SelectSingleNode,则只使用rateNode.SelectSingleNode("ISO")
。在xml文档上,您可以使用xmlDocument.SelectSingleNode("/LIST_RATE/RATE[ISO='EUR']/ISO")
查找值为EUR的iso节点。这对你有用吗?