将SQL结果集转换为XML

将SQL结果集转换为XML,sql,xml,Sql,Xml,我正在寻找一种可以将SQL结果集序列化和/或转换为XML的工具。从SQL结果集中简化XML生成过程既简单又琐碎,但这不是我需要的 解决方案必须与数据库无关,并且只接受常规SQL查询结果(不使用db xml支持)。这个工具的一个特殊挑战是提供嵌套的XML来匹配基于行的结果中的任何模式。中间步骤太慢和浪费-这需要在一个步骤中发生;没有RS->object->XML,最好没有RS->XML->XSLT->XML。它必须支持流式处理,因为结果集很大,XML很大 有什么事吗?据我所知没有。我会自己滚。这并

我正在寻找一种可以将SQL结果集序列化和/或转换为XML的工具。从SQL结果集中简化XML生成过程既简单又琐碎,但这不是我需要的

解决方案必须与数据库无关,并且只接受常规SQL查询结果(不使用db xml支持)。这个工具的一个特殊挑战是提供嵌套的XML来匹配基于行的结果中的任何模式。中间步骤太慢和浪费-这需要在一个步骤中发生;没有RS->object->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>"
#/usr/bin/env jruby
导入java.sql.DriverManager
#做一些魔术来加载驱动程序
conn=DriverManager.getConnection(ARGV[0],ARGV[1],ARGV[2])
res=conn.executeQuery ARGV[3]
放置“”
meta=资源元数据
而res.next
放置“”
对于1..meta.column\u计数中的n
column=meta.getColumnName n

放置“#{res.getString(n)}dbunit(www.dbunit.org)从SQL到XML,反之亦然;您可以根据需要修改它。

在.NET中,您可以从任何源填充数据集,然后可以将它写到磁盘上,作为XML或有或没有模式。不能说大集合的性能是什么样的。简单::/P>< P>用SQL Server,您确实应该考虑USI。正在为查询中的XML构造初始化


如果您使用的是.Net,只需使用DataAdapter来填充数据集。一旦数据集位于数据集中,只需使用其.WriteXML()方法。这打破了您的DB->object->XML规则,但实际上就是这样。您可能可以使用datareader解决一些问题,但我对此表示怀疑。

从技术上讲,将结果集转换为XML文件是直截了当的,不需要任何工具,除非您需要转换数据结构以适应特定的导出通常,结果集获取XML文件的顶级元素,然后生成许多包含属性的记录元素,这些属性实际上是记录的字段

例如,当涉及Java时,您只需要适当的JDBC驱动程序来与您选择的DBMS接口,以满足数据库独立性需求(通常由DBMS供应商提供),以及几行代码来读取结果集,并为每个记录、每个字段打印XML字符串。在我看来,对于普通Java开发人员来说,这不是一项困难的任务


无论如何,你陈述的目的越具体,你得到的答案就越具体。

在Java中,你可以用xml数据(如实体bean)填充一个对象,然后使用XMLEncoder将其转换为xml。从那里你可以使用XSLT进行进一步的转换,或者使用XMLDecoder将其带回一个对象

格里茨,加德


PS:请参阅对象到XML部分的示例…从DB到对象有多种可能的方式:JDBC、Groovy数据集或GORM。Apache Common Beans可以通过类似反射的方法帮助填充JavaBeans。

我使用相当于邮件合并的方法,使用resultset作为源和模板创建了一个解决方案通过合并它来生成所需的XML

该模板是标准的XML,带有一个页眉元素、一个页脚元素和一个正文元素。在正文元素中使用CDATA块可以包含一个完整的XML结构,作为每一行的模板。为了在模板中包含来自结果集的字段,我使用了如下所示的标记然后对模板进行预解析以隔离标记,这样在操作中,模板会在生成主体时从结果集请求每个字段

页眉和页脚元素仅在输出集的开头和结尾输出一次。正文可以是所需的任何XML或文本结构。在您的情况下,听起来您可能有多个模板,每个模板对应一个所需的架构


以上所有内容都封装在一个模板类中,因此在加载模板后,我只调用了
merge()
在将结果集作为参数传入的模板上。

另一个选项是直接从SQL语句编写XML,具体取决于需要输出的模式数量和/或此解决方案的动态性,如下面的简单示例所示

SELECT 
    '<Record>' ||
        '<name>' || name || '</name>' ||
        '<address>' || address || '</address>' ||
    '</Record>'
FROM
    contacts
选择
'' ||
“姓名”||
“地址”||
''
从…起
联络

您必须预先添加并附加document元素,但我认为这个示例很容易理解。

什么平台、语言?是的,如果问题同样简单,这将是一个简单的解决方案。我需要能够直接映射到现有的XML模式。这些模式可能相当复杂,并且需要在某些方面进行深度嵌套cases.XSLT将作为一个中间步骤,但如果可以的话,我宁愿避免这样做。嗯,我想我明白你的意思了。我仍然认为滚动自己的脚本将是最好的选择。可能没有这么简单,但我认为这比尝试让一些现有工具为你的(显然是特定的)工作更容易需要。甚至在使用模式之前,我就已经使用过“for xml”。唯一的缺点是对数据库的性能影响。不过,从带有模式绑定的数据集编写xml似乎是一个选项。我会尝试一下。你能告诉我怎么做吗?欢迎使用stackoverflow。不太适合使用“请给我发电子邮件以获取代码”“在这里的答案中-答案应该是独立的,并且能够超过它们可能包含的任何外部引用。您的代码是否足够小,以至于它(或重要的部分)可能适合这个答案?