xml - 返回 XML 文件中的所有节点,即使它们为空

标签 xml vba msxml

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

Dim xmlDoc As New DOMDocument60

我感兴趣的 XML 部分如下所示,基本上只是为每个 UserBean 重复自身。 UserBean 基本上是系统中的用户帐户。

<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

最佳答案

what i'm after is a list of Userbeans, which are in themselves a list

您需要从“节点”而非“列表”的角度来思考。 selectNodes 返回一个指向一组节点的指针,但是当您遍历它时,您最终会得到一个 IXMLDOMNode,而不是一个节点列表。只能通过调用selectNodes等方法获取nodeList。

您可以再次调用selectNodes,或者只使用IXMLDOMNode 的childNodes 属性,Documented at 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

关于xml - 返回 XML 文件中的所有节点,即使它们为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16685190/

相关文章:

xml - 如何确定 XMLNode 在 XML 文档中的位置?

java - 快速替换 XML 节点值

html - XSLT 转换 - INNERHTML

html - 由于网络中断,VBA 随机停止执行循环。互联网恢复后如何恢复?

c++ - < & > 被转换为 > < 等

sql-server - msxml XMLHTTPRequest 和超时

sql - 如何在 Oracle 中通过 XPath 获取第一个元素

sql - 如何在oracle中提取或更新xml属性值

excel - 我想要 50 个 5 列 10 行的随机数组的数据,具有唯一且没有重复值。这里为什么显示重复值?

performance - 尝试在 Microsoft Access 中制作高效的日历