如何在 VBScript 中将 oracle 结果集转换为 XML

How to convert oracle resultset to XML in VBScript

我正在使用 QTP 查询 oracle DB 并取回值以写入文本文件。如何将结果转换为 xml 以便我可以将 XML 写入文本文件。

strSQL ="select * from emp"
Set rs = objDBConn.Execute(strSQL)

写入txt文件

Set objFSO=CreateObject("Scripting.FileSystemObject")
outFile="C:\test.txt"
Set objFile = objFSO.CreateTextFile(outFile,True)
while not rs.EOF
row = ""
first_field = true
For Each field In rs.Fields
if (first_field = true) then
  row = field
  first_field = false
else
  row = row & " " & field
end if
Next  
objFile.Write row & vbCrLf
rs.MoveNext 
wend

如果您对默认命名不挑剔,那么最快的方法是:

select dbms_xmlgen.getxml( 'select * from emp') from dual

您也可以使用.Save 方法将记录集存储到.XML 文件中(记得定义Const adPersistXML = 1)。该格式可能更适合其他 Microsoft XML 工具。

我认为我个人的方法是创建一个 XML object,从查询的结果数组中创建 child 个节点,将 child 个节点附加到parent,然后将 object 中的 .xml 转储到文本文件中。

很久以前我写了下面的通用函数,我想你可能会发现它对你正在尝试做的事情有帮助:

Function RequestAddChildNodeWithAttributes(NodeLocation, NodeName, NodeIndex, NodeAttributes, NodeValue)
Set parentNode = objXML.SelectNodes(NodeLocation).Item(NodeIndex)
Set newNode = objXML.CreateElement(NodeName)
For AttributeLoop = 0 To CInt(UBound(NodeAttributes) / 2) Step 2
    If NodeAttributes(AttributeLoop) <> "" Then newNode.setAttribute NodeAttributes(AttributeLoop), NodeAttributes(AttributeLoop + 1)
Next
If NodeValue <> "" Then newNode.Text = NodeValue
parentNode.appendChild newNode
End Function

尝试运行以下代码片段以了解其工作原理:

Set objXML = CreateObject("Microsoft.XMLDOM")
objXML.loadXML("<parent/>")
RequestAddChildNodeWithAttributes "/parent", "row1", 0, Array("header1", "result1", "header2", "result2", "header3", "result3"), "nodeValue1"
RequestAddChildNodeWithAttributes "/parent", "row2", 0, Array("header1", "result1", "header2", "result2", "header3", "result3"), "nodeValue2"
Print objXML.xml

注意:您不需要在 NodeValue 参数中为您所做的任何事情,因此只需传入一个空字符串值,它不会写入值但会填充属性。

您只需从查询返回的数组中获取 headers(数组中的位置 0),然后遍历其余行*。生成后,您可以使用以下代码创建结果文件并将 .xml 转储到其中:

Set FileOut = CreateObject("Scripting.FileSystemObject").CreateTextFile(ResultFileName, true)
FileOut.Write objXML.xml
FileOut.Close

ETA:如果您需要,我可以尝试挖掘用于解析查询生成的数组的代码。