我正在寻找一种可以将SQL结果集序列化和/或转换为XML的工具。从SQL结果集中减少XML生成是简单而微不足道的,但这不是我需要的。
解决方案必须是数据库中立的,并且只接受常规SQL查询结果(不使用db xml支持)。此工具的一个特殊挑战是提供嵌套XML,以匹配基于行的结果中的任何模式。中间步骤太慢而且浪费 - 这需要在一个步骤中完成;没有RS-> object-> XML,最好没有RS-> XML-> XSLT-> XML。由于结果集很大,它必须支持流式传输,大XML。
有什么东西吗?
答案 0 :(得分:2)
不是我知道的。我会自己动手。这并不难,也许是这样的:
#!/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>"
免责声明:我刚刚完成了所有这些,我甚至都不想假装它有效。 : - )
答案 1 :(得分:2)
在.NET中,您可以从任何源填充数据集,然后它可以将其作为XML(无论是否使用模式)写入磁盘。我不能说大型集的表现会是什么样的。简单:)
答案 2 :(得分:2)
使用SQL Server,您确实应该考虑在查询中使用 FOR XML 构造。
如果您使用的是.Net,只需使用DataAdapter填充数据集即可。一旦它在数据集中,只需使用它的.WriteXML()方法。这打破了你的DB-&gt; object-&gt; XML规则,但它确实是如何完成的。您可能可以使用datareader解决问题,但我对此表示怀疑。
答案 3 :(得分:1)
另一个选项,取决于您需要输出多少模式,和/或此解决方案应该是多么动态,实际上是直接从SQL语句中编写XML,如下面的简单示例所示......
SELECT
'<Record>' ||
'<name>' || name || '</name>' ||
'<address>' || address || '</address>' ||
'</Record>'
FROM
contacts
你必须在文档元素的前面添加和附加,但我认为这个例子很容易理解。
答案 4 :(得分:0)
dbunit(www.dbunit.org)确实从sql转到xml,反之亦然;您可以根据自己的需要对其进行修改。
答案 5 :(得分:0)
从技术上讲,将结果集转换为XML文件是直截了当的,除非您需要转换数据结构以适合特定的导出模式,否则不需要任何工具。通常,结果集获取XML文件的顶级元素,然后生成包含属性的多个记录元素,这些属性实际上是记录的字段。
例如,对于Java,您只需要适当的JDBC驱动程序来连接您选择的DBMS,以满足数据库独立性要求(通常由DBMS供应商提供),以及几行代码来读取结果集并为每个字段打印每个记录的XML字符串。在我看来,对于普通的Java开发人员来说,这不是一项艰巨的任务。
无论如何,更具体的目的是说明你得到的更具体的答案。
答案 6 :(得分:0)
在Java中,您可以使用xml数据填充对象(如实体bean),然后使用XMLEncoder将其转换为xml。从那里你可以使用XSLT进行进一步的转换,或者使用XMLDecoder将它带回一个对象。
Greetz,GHad
PS:有关Object to XML部分的示例,请参阅http://ghads.wordpress.com/2008/09/16/java-to-xml-to-java/ ...从DB到Object可以采用多种方式:JDBC,Groovy DataSet或GORM。 Apache Common Beans可以通过类似反射的方法帮助填充JavaBeans。
答案 7 :(得分:0)
我通过使用结果集作为源的等效邮件合并以及合并它以生成所需XML的模板,创建了此问题的解决方案。
模板是标准XML,带有Header元素,Footer元素和Body元素。在Body元素中使用CDATA块允许我包含一个完整的XML结构,该结构充当每行的模板。为了在模板中包含结果集中的字段,我使用了类似于<[FieldName]>
的标记。然后对模板进行预解析以隔离标记,以便在操作中,模板在生成Body时从结果集中请求每个字段。
页眉和页脚元素仅在输出集的开头和结尾输出一次。正文可以是任何所需的XML或文本结构。在您的情况下,听起来您可能有几个模板,每个模板对应一个所需的模式。
以上所有内容都封装在Template类中,这样在加载Template之后,我只是在模板上调用merge()
作为参数传递结果集。