我有点陷入以下困境:我尝试使用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)我使用以下代码循环遍历LIST_RATE节点的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问题,但仍然坚持.我很确定解决方案很简单 – 我只需要满足所有目标.任何对正确方向的建议或指导都将受到高度赞赏.提前致谢!
解决方法
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节点.这对你有用吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。