3

我通过 VBA 在 Access 2010 中通过 WSDL 检索了一个 XML 文件。XML 文件位于此变量中

Dim xmlDoc As New DOMDocument60

我感兴趣的 XML 部分如下所示,基本上只是对每个UserBean. AUserBean基本上是系统中的用户帐户。

<UserBean xsi:type="ns1:UserBean">  
    <primaryKey xsi:type="xsd:string">49084</primaryKey>  
    <updateIndex xsi:type="xsd:int">14</updateIndex>  
    <deleted xsi:type="xsd:boolean">false</deleted>  
    <loginID xsi:type="xsd:string">61420313556</loginID>  
    <name xsi:type="xsd:string">Andrew Mills</name>    
    <teams xsi:type="soapenc:Array" soapenc:arrayType="xsd:string[1]">  
        <string xsi:type="xsd:string">Maintenance</string>  
    </teams>  
    <timezone xsi:type="xsd:string">Australia/Brisbane</timezone>  
    <userTypePK xsi:type="xsd:string">3776</userTypePK>  
    <description xsi:type="xsd:string"/>  
    <emailAddress xsi:type="xsd:string"/>  
    <phoneNumber xsi:type="xsd:string"/>  
    <faxNumber xsi:type="xsd:string"/>  
    <pagerNumber xsi:type="xsd:string"/>  
    <mobileNumber xsi:type="xsd:string">61420313556</mobileNumber>  
    <securityQuestion xsi:type="xsd:string">__INVALID</securityQuestion>  
    <securityAnswer xsi:type="xsd:string"/>  
    <synchronisation xsi:type="soapenc:Array" soapenc:arrayType="ns2:SynchronisationBean[0]" xmlns:ns2="http://soap2.nads.econz.co.nz"/>  
</UserBean>

问题是并非每个字段都必须填写。
因此,某些节点没有数据
在 VBA 中使用 MSXML2 库仅在其中实际存在文本时才返回节点。因此,下面的代码将根据每个 userbean 包含的内容返回可变数量的节点。例如,某些用户没有填充 mobileNumber。

Set nodes xmlDoc.selectNodes("//UserBean")
For Each node in nodes  
    debug.print node.text  
next node

上面的代码返回一个长字符串,其中包含所有子节点的所有值(相对于Userbean节点),但只有具有文本的子节点。我正在尝试将其放入 Access 中的表中,如果某些节点有时会丢失,我无法跟踪它......还是我?

如何返回所有节点,无论它们是否已填充或
如何
识别具有文本的节点的名称,以便我知道将值放入 Access 表中的何处?

更新
除了下面的评论,我想要的是一个 Userbeans 列表,它们本身就是一个列表......所以事实上我在一个列表列表之后......所以考虑到这一点,我尝试了下面但它在第一个For Each循环中失败了。显然,这种类型的循环不能处理使用列表作为另一个列表的计数器。有没有解决的办法?

Dim node As MSXML2.IXMLDOMNode
Dim userbeans As MSXML2.IXMLDOMNodeList
Dim userbean As MSXML2.IXMLDOMNodeList

Set userbeans = xmlDoc.selectNodes("//UserBean")
For Each userbean In userbeans '**Type mismatch error here**
    For Each node In userbean
          Debug.Print node.nodeName & ":" & node.Text
    Next node
Next userbean
4

1 回答 1

6

我想要的是一个 Userbeans 列表,它们本身就是一个列表

您需要考虑“节点”,而不是“列表”。 selectNodes返回指向一组节点的指针,但是当您遍历它时,您会得到一个 IXMLDOMNode,而不是节点列表。只能通过调用方法获取nodeList,例如selectNodes。

您可以再次调用 selectNodes 或者只使用 IXMLDOMNode 的 childNodes属性,记录在 MSDN

Dim userBeanList As MSXML2.IXMLDOMNodeList
Dim userbean As MSXML2.IXMLDOMNode
Dim beanChild As MSXML2.IXMLDOMNode

Set userBeanList = xmlDoc.selectNodes("//UserBean")
For Each userBean In userBeanList 
    For Each beanChild In userBean.childNodes
          Debug.Print beanChild.nodeName & ":" & beanChildText
    Next beanChild
Next userBean

请注意,使用适当的 XPath 查询,您只需选择符合您的条件的节点列表。由于这是 VBA,除非您打算利用智能感知,否则您可以跳过显式声明。

dim badNodes, badNode
set badNodes = xmlDoc.selectNodes("//UserBean/*[not(text())]")
if badNodes.length < 1 then
  debug.Print "All good!"
else
  debug.Print "following nodes are empty:"
  For Each badNode in badNodes
    debug.print " - " & badNode.name
  next badNode
endif
于 2013-05-23T01:31:02.860 回答