将SQL结果集转换为XML

3
我正在寻找一种工具,可以将SQL结果集序列化和/或转换为XML。从SQL结果集获得简化的XML生成是简单而琐碎的,但这不是我需要的。
该解决方案必须与数据库无关,并且仅接受常规SQL查询结果(不使用db xml支持)。此工具的一个特殊挑战是提供匹配任何基于行的结果模式的嵌套XML。中间步骤太慢且浪费资源 - 这需要在一个步骤中完成;最好没有RS->对象->XML,也最好没有RS->XML->XSLT->XML。由于大型结果集和大型XML,它必须支持流式传输。
有没有这样的工具存在?

什么平台,使用什么编程语言? - UnkwnTech
8个回答

2
我不知道有没有现成的解决方案。我会自己动手实现,这并不难,可以尝试这样做:
```html 代码示例 ```
#!/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>"

免责声明:我刚刚编造了所有这些内容,甚至都不想假装它真的有效。 :-)


如果问题同样简单,那么这将是一个简单的解决方案。我需要能够直接映射到现有的XML模式。这些模式可能非常复杂,并且在某些情况下需要深度嵌套。XSLT可以作为中间步骤工作,但如果可能的话,我宁愿避免使用它。 - tvaananen
嗯,我想我明白你的意思了。我仍然认为编写自己的脚本是最好的选择。虽然可能不是这么简单,但我认为这比尝试让某个现有工具适应你(显然很特殊的)需求要容易得多。 - Daniel Spiewak

2

.NET中,你可以从任何数据源填充数据集,然后将其作为带或不带模式的XML写入磁盘。对于大型数据集的性能表现无法确定。简单明了 :)


2

使用SQL Server时,您应该考虑在查询中使用FOR XML结构。

如果您正在使用.Net,则只需使用DataAdapter填充数据集。一旦它在数据集中,只需使用其.WriteXML()方法即可。这打破了您的DB->对象->XML规则,但事实上就是这样做的。您可能能够使用datareader解决一些问题,但我怀疑。


我以前使用过“for xml”,甚至还用过模式。唯一的缺点是数据库性能会受到影响。不过,从带有模式绑定的数据集中编写XML似乎是一个选项。我会尝试一下。 - tvaananen
你能给我演示一下吗?? http://stackoverflow.com/questions/17051336/retrieve-sql-data-and-store-it-in-a-file-in-xml-format - Philo

1

另一种选择,取决于您需要输出多少个模式,以及/或者这个解决方案应该有多动态,是直接从SQL语句中编写XML文件的方式,就像以下简单示例中所示...

SELECT 
    '<Record>' ||
        '<name>' || name || '</name>' ||
        '<address>' || address || '</address>' ||
    '</Record>'
FROM
    contacts

你需要在文档元素前面和后面添加内容,但我认为这个例子足够容易理解。

0

dbunit(www.dbunit.org)可以将SQL转换为XML,反之亦然;您可能可以根据自己的需求进行更多修改。


0

从技术上讲,将结果集转换为XML文件非常简单,除非您需要将数据结构转换以适应特定的导出模式,否则不需要任何工具。通常情况下,结果集获取XML文件的顶级元素,然后生成包含属性的多个记录元素,这些属性实际上是记录的字段。

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

无论如何,您提出的目的越具体,您得到的答案就越具体。


0
在Java中,您可以使用XMLEncoder将对象填充到xml数据中(如实体bean),然后使用XSLT进行进一步转换或使用XMLDecoder将其转换回对象。
问候,GHad
PS:请参见http://ghads.wordpress.com/2008/09/16/java-to-xml-to-java/以获取有关从对象到XML部分的示例...从DB到对象,还有多种方式可供选择:JDBC,Groovy DataSets或GORM。 Apache Common Beans可以通过反射样式方法帮助填充JavaBeans。

0

我通过使用类似邮件合并的方式来解决这个问题,将结果集作为源数据,使用模板进行合并以生成所需的XML。

模板是标准的XML格式,包含一个Header元素、一个Footer元素和一个Body元素。在Body元素中使用CDATA块,可以包含完整的XML结构,作为每一行的模板。为了在模板中包含结果集中的字段,我使用了类似于<[FieldName]>的标记。然后预处理模板,以隔离这些标记,使得在操作时,模板会请求结果集中的每个字段,以生成Body。

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

所有上述内容都封装在一个Template类中,因此在加载模板后,我只需调用传递结果集作为参数的merge()方法即可。


欢迎来到stackoverflow。在回答中放置“请通过电子邮件联系我以获取代码”并不是很合适 - 回答应该是独立的,并且能够生存于其可能包含的任何外部引用之外。你的代码是否足够小,以至于它(或重要部分)可以适合于这个答案中呢? - Flexo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接