该解决方案必须与数据库无关,并且仅接受常规SQL查询结果(不使用db xml支持)。此工具的一个特殊挑战是提供匹配任何基于行的结果模式的嵌套XML。中间步骤太慢且浪费资源 - 这需要在一个步骤中完成;最好没有RS->对象->XML,也最好没有RS->XML->XSLT->XML。由于大型结果集和大型XML,它必须支持流式传输。
有没有这样的工具存在?
#!/usr/bin/env jruby
import java.sql.DriverManager
# TODO some magic to load the driver
conn = DriverManager.getConnection(ARGV[0], ARGV[1], ARGV[2])
res = conn.executeQuery ARGV[3]
puts "<result>"
meta = res.meta_data
while res.next
puts "<row>"
for n in 1..meta.column_count
column = meta.getColumnName n
puts "<#{column}>#{res.getString(n)}</#{column}"
end
puts "</row>"
end
puts "</result>"
免责声明:我刚刚编造了所有这些内容,甚至都不想假装它真的有效。 :-)
.NET中,你可以从任何数据源填充数据集,然后将其作为带或不带模式的XML写入磁盘。对于大型数据集的性能表现无法确定。简单明了 :)
使用SQL Server时,您应该考虑在查询中使用FOR XML结构。
如果您正在使用.Net,则只需使用DataAdapter填充数据集。一旦它在数据集中,只需使用其.WriteXML()方法即可。这打破了您的DB->对象->XML规则,但事实上就是这样做的。您可能能够使用datareader解决一些问题,但我怀疑。
另一种选择,取决于您需要输出多少个模式,以及/或者这个解决方案应该有多动态,是直接从SQL语句中编写XML文件的方式,就像以下简单示例中所示...
SELECT
'<Record>' ||
'<name>' || name || '</name>' ||
'<address>' || address || '</address>' ||
'</Record>'
FROM
contacts
dbunit(www.dbunit.org)可以将SQL转换为XML,反之亦然;您可能可以根据自己的需求进行更多修改。
从技术上讲,将结果集转换为XML文件非常简单,除非您需要将数据结构转换以适应特定的导出模式,否则不需要任何工具。通常情况下,结果集获取XML文件的顶级元素,然后生成包含属性的多个记录元素,这些属性实际上是记录的字段。
例如,在Java方面,您只需要适当的JDBC驱动程序来与您选择的DBMS进行接口交互,以满足数据库独立性要求(通常由DBMS供应商提供),并且几行代码来读取结果集并打印出每个记录、每个字段的XML字符串。对于一般的Java开发人员来说,这不是一个困难的任务。
无论如何,您提出的目的越具体,您得到的答案就越具体。
我通过使用类似邮件合并的方式来解决这个问题,将结果集作为源数据,使用模板进行合并以生成所需的XML。
模板是标准的XML格式,包含一个Header元素、一个Footer元素和一个Body元素。在Body元素中使用CDATA块,可以包含完整的XML结构,作为每一行的模板。为了在模板中包含结果集中的字段,我使用了类似于<[FieldName]>
的标记。然后预处理模板,以隔离这些标记,使得在操作时,模板会请求结果集中的每个字段,以生成Body。
Header和Footer元素仅在输出集的开头和结尾输出一次。Body可以是任何所需的XML或文本结构。在您的情况下,听起来您可能有几个模板,每个模板对应您所需的架构之一。
所有上述内容都封装在一个Template类中,因此在加载模板后,我只需调用传递结果集作为参数的merge()
方法即可。