我正在使用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
答案 0 :(得分:2)
如果您对默认命名不挑剔,那么最快的方法是:
select dbms_xmlgen.getxml( 'select * from emp') from dual
答案 1 :(得分:2)
您还可以使用.Save方法将记录集存储到.XML文件中(请记住定义Const adPersistXML = 1
)。该格式可能更适合其他Microsoft XML工具。
答案 2 :(得分:1)
我认为我的个人方法是创建一个XML对象,从查询中从结果数组创建子节点,将子节点附加到父节点,然后将.xml从对象转储到文本文件中。 / p>
我很久以前写过以下通用功能,并认为您可能会发现它对您要做的事情有帮助:
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参数中你不需要任何东西来做你正在做的事情,所以只传入一个空字符串值,它不会写一个值但会填充属性。
您只需要从查询返回的数组中获取标头(数组中的位置0),然后循环遍历其余的行*。生成后,您可以使用以下代码创建结果文件并将.xml转储给它:
Set FileOut = CreateObject("Scripting.FileSystemObject").CreateTextFile(ResultFileName, true)
FileOut.Write objXML.xml
FileOut.Close
ETA:如果您需要,我可以尝试挖掘解析查询生成的数组的代码。