【发布时间】:2011-10-28 19:15:34
【问题描述】:
我从网站获取一个 XML 到一个字符串 strXML。 然后我创建一个 XML DOM 文档:
Dim xmlDoc As MSXML2.DOMDocument
Dim xmlElement As MSXML2.IXMLDOMElement
Dim xmlNode As MSXML2.IXMLDOMElement
Set xmlDoc = New MSXML2.DOMDocument
xmlDoc.loadXML (strXML)
DisplayNode xmlDoc.childNodes
现在 DisplayNode 是一种递归方法,它为 XML 数据中的每一行调用自身:
Public Sub DisplayNode(ByRef Nodes As MSXML2.IXMLDOMNodeList)
Dim xNode As MSXML2.IXMLDOMNode
For Each xNode In Nodes
If xNode.nodeType = NODE_TEXT Then
Debug.Print xNode.parentNode.nodeName & " = " & xNode.nodeValue
Else
If xNode.parentNode.nodeName = "data" Then Debug.Print "*** NEW RECORD ***"
End If
If xNode.hasChildNodes Then
DisplayNode xNode.childNodes
Debug.Print "> recursive call - next field<"
End If
Next xNode
End Sub
这里的问题是如何将递归循环中的 XML 数据输入到记录中。如果它只是一个普通的循环,那会很容易,但是递归循环不能保持卡车正在输入哪个字段和哪个记录,因为它不断地传递它的参数。
我现在可以看到的一种方法是创建一个包含两个字符串的对象集合。我可以将所有数据节点添加到此集合中,然后使用循环将数据从集合中移动到记录集中。
但是,我想知道是否可以在不使用递归方法而仅使用普通循环的情况下读取 XML 字符串,或者是否可以使用不同的方式将自定义 XML 文件/字符串加载到记录集中。
这是 DisplayNode 的输出:
*** NEW RECORD***
EVENTID = 75098
> recursive call <
DESCRIPTION = Pack
> recursive call <
NAME = John Smith
> recursive call <
CUSTOMERID = 37684
> recursive call <
TRADER = MY COMPANY
> recursive call <
ADDRESS = Flat A
SOUTHILL PARK
LONDON
> recursive call <
> recursive call <
*** NEW RECORD***
.
.
.
repeats
编辑: 显然,可以在递归调用之间传递对记录集的引用,并且记录集将保留其状态,因此可以逐个输入字段并保存记录。请参阅下面的完整解决方案。
【问题讨论】:
-
如果您想将此数据放入(表格)记录集中,那么它可能也是“表格”(即没有深度嵌套)?如果是这种情况,跳过递归并使用几个嵌套循环来处理它会容易得多。格式是预先确定的,还是您尝试处理任何 XML?
-
那么您不需要递归,将数据放入记录集更容易...您可以发布 XML 示例吗?
-
谢谢蒂姆,但没必要,我找到了一种以足够简单的方式使用递归模式的方法。我稍后会发布我的解决方案。
标签: ms-access vba ms-access-2007