Access VBA - 如何下载 XML 文件并将其数据输入记录集中
我从网站获取 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
编辑: 显然,可以在递归调用之间传递对记录集的引用,并且记录集将保留其状态,以便可以逐一输入字段并保存记录。请参阅下面的完整解决方案。
I get an XML from website into a string strXML.
Then I create an XML DOM document:
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
Now the DisplayNode is a recursive method which calls itself for every line in the XML data:
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
The problem here is how to enter the XML data from a recursive loop into a recordest. If it was just a normal loop it would be easy, but a recursive loop cannot keep a truck of which field and which record is being entered as it is continuously passing its parameters.
One way that I can see to do it at the moment is to create a collection of objects which contain two strings. I could add all data nodes to this collection and then use a loop to move data from the collection into a recordset.
However, I wonder if it is possible to read XML string without using a recursive method just plain loops, or perhaps there is a different way of loading a custom XML file/string into a recordset.
This is the output of 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
EDIT:
Apparently it is possible to pass a reference to a recordset between the recursive calls and the recordset will preserve its state so one by one field can be entered and the record saved. See the full solution below.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用 MSXML2.IXMLDOMNode.selectNode() 来通过 xpath 表达式显式选择节点?这样,您就可以跟踪从外部输入的字段/记录。
You could use
MSXML2.IXMLDOMNode.selectNode()
to explicitly select nodes via xpath expressions? This way, you keep track of which fields/records are entered from outside.这是一个可行的解决方案。下面的方法需要位于将显示 XML 数据的访问表单中。表单中的文本字段应设置为它们的“控制源”与 ADODB 记录集中添加的字段具有相同的名称。
下面的方法将一一字段输入到传递的记录集中。因为 MSXML2 似乎会跳过像
这样的空标签,所以每个带有数据的标签名称都需要按名称进行检查并将其输入到适当的记录集字段中。Here is a working solution. The method below needs to be in the Access Form which will display the XML data. The text fields in the form should be set that their 'Contol source' has the same names as the fields addedd in the ADODB recordset.
The method below enters one by one field into the passed recordset. Because MSXML2 seems to skip empty tags like
<something></something>
each tag name with data needs to be checked by name and entered into an appropriate recordset field.