如何在 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:如果您需要,我可以尝试挖掘用于解析查询生成的数组的代码。
我正在使用 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:如果您需要,我可以尝试挖掘用于解析查询生成的数组的代码。