我正在尝试从an XML file中提取如下所示的货币汇率:
<CRates xmlns="http://www.bank.lv/vk/LBCurrencyRates.xsd" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bank.lv/vk/LBCurrencyRates.xsd LBCurrencyRates.xsd http://purl.org/dc/elements/1.1/ http://www.dublincore.org/schemas/xmls/qdc/dc.xsd" dc:description="The exchange rates are euro reference rates published by the ECB. The reference rates are published daily when TARGET system is open. New rates are typically published between 15:15GMT+2 and 16:00GMT+2." dc:source="http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml">
<Date>20180803</Date>
<Currencies>
<Currency>
<ID>AUD</ID>
<Rate>1.56890</Rate>
</Currency>
</Currencies>
</CRates>
我正在使用以下公式尝试获取Rate
元素的值:
=FILTERXML(myxml,"//Currencies/Currency[@ID='AUD']/Rate/.")
但是我无法获得想要的价值。
答案 0 :(得分:0)
如果XML位于单元格A2
中,则可以使用:
=MID(A2,FIND("<Rate>",A2)+6,FIND("</Rate>",A2)-FIND("<Rate>",A2)-6)
。 。 。 或。 。
。getTagValue
或者,您可以使用此函数提取您指定的任何两个字符串(或标签)之间的任何内容。
Public Function getTagValue(xml As String, tagStart As String, _
tagStop As String, Optional startPos As Long) As Variant
'returns value from [xml] between [tagStart] & [tagStop], starting at [startPos]
Dim cStart As Long, cStop As Long
If startPos = 0 Then startPos = 1 'adjust since [startPos] tag is optional
cStart=InStr(startPos,xml,tagStart,vbTextCompare)+Len(tagStart)'find tagStart
cStop=InStr(cStart, xml, tagStop, vbTextCompare) 'find tagStop
If cStart = 0 Or cStop = 0 Then
getTagValue = "[n/a]" 'could not find start or end tag
Exit Function
End If
getTagValue = Trim(Mid(xml, cStart, cStop - cStart)) 'get text between tags
If IsNumeric(getTagValue) Then getTagValue=Val(getTagValue) 'fix if number
End Function
在工作表单元格中,此:
=getTagValue(WEBSERVICE("http://www.bank.lv/vk/ecb.xml"),"<rate>","</rate>")
...返回一个类似1.5629
的数字(因为该值为数字)。
如果单元格A1
包含XML,则此内容:
=getTagValue(A1,"<ID>","</ID>")
...返回类似AUD
的字符串(因为该值不是数字)。
如果您想验证标签是否存在,或计算一个标签(例如XML)在一个字符串中出现的次数,则此函数返回一个计数(如果找不到则返回0
。)
Public Function countOccur (searchWithin As String, toFind As String) As String
'returns the count of occurrences of [toFind] within [searchWithin]
countOccur = UBound(Split(searchWithin, toFind))
End Function
FILTERXML
Function WEBSERVICE
function 答案 1 :(得分:0)
我不了解Excel方面的内容,但是您的XPath查询不正确。 @
表示您正在查看元素的属性,而不是元素的内容。
尝试以下方法:
//Currency[./ID = 'AUD']/Rate/text()
首先从简单的全局搜索Currency
元素开始,然后(在方括号中)对子ID
元素进行相对搜索。如果匹配,请继续使用Rate
元素并获取其文本内容。
答案 2 :(得分:0)
我知道这是一个旧线程,但是我遇到了同样的问题,并发现XML命名空间声明将它抛弃了。从XML中删除这些后,FILTERXML函数将按预期工作。希望这会有所帮助。