FILTERXML获取数据

时间:2018-08-07 10:04:24

标签: xml excel xpath

我正在尝试从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/.")

但是我无法获得想要的价值。

3 个答案:

答案 0 :(得分:0)

如果XML位于单元格A2中,则可以使用:

=MID(A2,FIND("<Rate>",A2)+6,FIND("</Rate>",A2)-FIND("<Rate>",A2)-6)

。 。 。 。 。


VBA功能: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

更多信息:

答案 1 :(得分:0)

我不了解Excel方面的内容,但是您的XPath查询不正确。 @表示您正在查看元素的属性,而不是元素的内容。

尝试以下方法:

//Currency[./ID = 'AUD']/Rate/text()

首先从简单的全局搜索Currency元素开始,然后(在方括号中)对子ID元素进行相对搜索。如果匹配,请继续使用Rate元素并获取其文本内容。

答案 2 :(得分:0)

我知道这是一个旧线程,但是我遇到了同样的问题,并发现XML命名空间声明将它抛弃了。从XML中删除这些后,FILTERXML函数将按预期工作。希望这会有所帮助。