将String Array Fom XML读入VBA

时间:2016-05-16 05:51:13

标签: asp.net xml string vba web-services

我有以下XML,这是某个WEB服务的结果。



<?xml version="1.0" encoding="UTF-8"?>

-<ArrayOfString xmlns="http://tempuri.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<string>16/May/2016 - 20/May/2016</string>

<string>20/May/2016 - 23/May/2016</string>

<string>23/May/2016 - 27/May/2016</string>

<string>27/May/2016 - 30/May/2016</string>
</ArrayOfString>
&#13;
&#13;
&#13;

我有以下VBA代码来阅读Above XML

    strRet = PostWebservice(strUrlEBenefit, strSoapAction, strXml)
    intPos1 = InStr(strRet, "<string>") + 8
    intPos2 = InStr(strRet, "</string>")

    If intPos1 > 11 And intPos2 > 0 Then
        xmlresult = Mid(strRet, intPos1, intPos2 - intPos1)
    End If

因此我得到&#34; 2016年5月16日 - 2016年5月20日&#34;在xmlresult。

我想要做的是获取所有[string]标签之间的所有日期值。 你能指导我怎样才能达到效果?我理解我需要将其读入阵列,但我不知道如何以及没有看到任何有用的教程(VBA和XML初学者)来参考。

2 个答案:

答案 0 :(得分:1)

将从Web服务返回的xml-result读入xml-document并使用例如SelectSingleNode选择节点ArrayOfString。此节点具有namaspace,因此您还需要在xpath中使用名称空间。然后只读取所有子节点文本,例如在这里声明为result的集合。 HTH

注意:添加对Microsoft XML的引用,v6.0 dll

Sub GetDateValues()
    Dim xmlDocument As MSXML2.DOMDocument60
    Dim xmlNamespaces As String
    Dim arrayOfStringNode As IXMLDOMNode
    Dim result As Collection
    Dim xmlNode As IXMLDOMNode
    Dim strRet As String

    strRet = PostWebservice(strUrlEBenefit, strSoapAction, strXml)
    Set xmlDocument = New DOMDocument60

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

    xmlNamespaces = "xmlns:myns='http://tempuri.org/'"
    xmlDocument.setProperty "SelectionNamespaces", xmlNamespaces
    Set arrayOfStringNode = xmlDocument.SelectSingleNode("/myns:ArrayOfString")
    Set result = New Collection

    For Each xmlNode In arrayOfStringNode.ChildNodes
        result.Add xmlNode.Text
    Next xmlNode
End Sub

答案 1 :(得分:0)

我使用以下答案来推断:'dee',但是读入x列数的数组。以下之所以使用dNode的原因是因为Web服务通常返回与您想要的数组中的实际值相同级别的辅助元数据。因此,您此时必须使用SelectSingleNode。

xmlDoc.SetProperty "SelectionNamespaces", xmlNamespaces
Set xmlNodes = xmlDoc.SelectNodes("/myns:.../...")
rws = xmlNodes.length
cols = var '# of columns from the request sent or extrapolate this code to count children of a single node at the level necessary
ReDim xay(1 To rws, 1 To cols)

For Each xNode In xmlNodes
    r = r + 1
    For c = 1 To UBound(xay, 2)
        Set dNode = xNode.ChildNodes(c - 1)
        Set dNode = dNode.SelectSingleNode("myns:THE_VALUE")
        xay(r, c) = dNode.Text
    Next c
Next xNode