3

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

该解决方案必须是数据库中立的,并且只接受常规 SQL 查询结果(不使用 db xml 支持)。该工具的一个特殊挑战是提供与基于行的结果中的任何模式匹配的嵌套 XML。中间步骤太慢而且太浪费——这需要一步完成;没有 RS->object->XML,最好没有 RS->XML->XSLT->XML。由于结果集大、XML 大,它必须支持流式传输。

有什么可以做的吗?

4

8 回答 8

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>"

免责声明:我只是编造了所有这些,我什至懒得假装它有效。:-)

于 2008-09-17T19:57:12.227 回答
2

在 .NET 中,您可以从任何来源填充数据集,然后它可以为您将其作为 XML 写入磁盘,无论是否带有架构。我不能说大型套装的性能会是什么样的。简单的 :)

于 2008-09-17T20:09:35.737 回答
2

对于 SQL Server,您确实应该考虑在查询中使用FOR XML构造。

如果您使用的是 .Net,只需使用 DataAdapter 来填充数据集。一旦它在数据集中,只需使用它的 .WriteXML() 方法。这打破了您的 DB->object->XML 规则,但这确实是事情的完成方式。您也许可以使用数据阅读器解决问题,但我对此表示怀疑。

于 2008-09-17T20:25:19.490 回答
1

另一种选择,取决于您需要输出多少模式,和/或这个解决方案应该是多么动态,是直接从 SQL 语句实际编写 XML,如下面的简单示例所示......

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

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

于 2011-09-21T03:28:03.820 回答
0

dbunit (www.dbunit.org) 确实从 sql 转到 xml,反之亦然;您可能可以根据需要对其进行更多修改。

于 2008-09-17T19:59:54.653 回答
0

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

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

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

于 2008-09-17T21:56:31.690 回答
0

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

格瑞兹,GHad

PS:有关Object to XML 部分的示例,请参见http ://ghads.wordpress.com/2008/09/16/java-to-xml-to-java/... 从 DB 到 Object 有多种可能的方式:JDBC、Groovy 数据集或 GORM。Apache Common Beans 可能有助于通过类似反射的方法填充 JavaBeans。

于 2008-09-17T22:00:52.380 回答
0

我创建了一个解决此问题的解决方案,方法是使用结果集作为源的邮件合并,以及一个模板,通过该模板将结果集合并以生成所需的 XML。

该模板是标准 XML,带有一个 Header 元素、一个 Footer 元素和一个 Body 元素。在 Body 元素中使用 CDATA 块允许我包含一个完整的 XML 结构,该结构充当每一行的模板。为了在模板中包含来自结果集中的字段,我使用了看起来像这样的标记<[FieldName]>。然后对模板进行预解析以隔离标记,以便在操作中,模板在生成正文时从结果集中请求每个字段。

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

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

于 2011-09-21T03:22:35.040 回答