Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从XML文件返回所有节点,即使它们是空的_Xml_Vba_Msxml - Fatal编程技术网

从XML文件返回所有节点,即使它们是空的

从XML文件返回所有节点,即使它们是空的,xml,vba,msxml,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>

我在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>
上面的代码返回一个长字符串,其中包含与Userbean节点相关的所有子节点的所有值,但仅包含文本的值。我正试图将其放入Access中的一个表中,如果某些节点丢失了一些时间,我将无法跟踪它。。。还是我

如何返回所有节点,无论它们是否已填充 或 如何识别包含文本的节点的名称,以便知道在Access中的表中放置值的位置

更新 除了下面的评论,我想要的是一个UserBean列表,它们本身就是一个列表…所以事实上我想要的是一个列表列表…考虑到这一点,我尝试了下面的方法,但每次循环都失败了。显然,这种类型的循环无法处理将列表用作另一个列表的计数器的问题。有办法解决这个问题吗

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
我想要的是一个UserBean列表,它们本身就是一个列表

您需要从节点而不是列表的角度来思考。selectNodes返回一个指向一组节点的指针,但当您在其中进行迭代时,最终得到的是一个IXMLDOMNode,而不是节点列表。只能通过调用方法(如selectNodes)来获取节点列表

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

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

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

可能是:debug.print node.nodename&=&node.text这很接近@Tim Williams。代码的结果是UserBean=4908414false 614203andrew…等等,这样字段就不会被拆分。UserBean实际上是一个节点列表,但在这里它被视为一个节点。如果可能的话,请启动一个SQL server引擎——它的XML容量远远好于Access。FWIW@DougM-对不起,“启动SQL server引擎”是什么意思?很高兴能以最高效的方式完成此任务。Microsoft的SQL Server。Express版本包含完整的语法,可以轻松地作为单个桌面应用程序的后端。如果是多用户访问应用程序,您真的应该迁移到中央网络框。尝试以badNode的形式编辑您的帖子。名称应为badNode.nodeName,但其字符数小于强制编辑所需的字符数。我尝试了您的两个建议,两个都很好。非常感谢,我从你们两种方法中学到了很多。一旦我把数据放进表格,我会把我的最终解决方案公布给大家分享。再次感谢。
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
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