代码之家  ›  专栏  ›  技术社区  ›  tvaananen

将SQL结果集转换为XML

  •  3
  • tvaananen  · 技术社区  · 16 年前

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

    解决方案必须与数据库无关,并且只接受常规的SQL查询结果(不使用DBXML支持)。此工具的一个特殊挑战是提供与基于行的结果中的任何模式匹配的嵌套XML。中间步骤太慢且浪费-这需要在一个步骤中完成;没有rs->对象->xml,最好没有rs->xml->xslt->xml。由于结果集很大,XML也很大,所以它必须支持流式处理。

    有什么事吗?

    8 回复  |  直到 16 年前
        1
  •  2
  •   Steven Sudit    14 年前

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

    如果您使用.NET,只需使用DataAdapter来填充数据集。一旦它在数据集中,只需使用它的.writexml()方法。这打破了您的db->对象--gt;XML规则,但这实际上是事情的处理方式。你也许能用数据阅读器解决一些问题,但我对此表示怀疑。

        2
  •  2
  •   Daniel Spiewak    16 年前

    我不知道。我会自己滚。这并不难,也许是这样:

    #!/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>"
    

    免责声明: 我只是把这些都编出来了,我甚至都不想假装它起作用。-)

        3
  •  2
  •   typemismatch    16 年前

    在.NET中,您可以从任何源填充数据集,然后它可以将其作为XML(带或不带架构)写入磁盘。我说不出大型电视机的性能如何。简单:)

        4
  •  1
  •   Rodney Barbati    13 年前

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

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

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

        5
  •  0
  •   zmf    16 年前

    dbunit(www.dbunit.org)确实从SQL转换为XML,反之亦然;您可以根据需要对其进行更多的修改。

        6
  •  0
  •   Dmitry Korchagin    16 年前

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

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

    总之,你陈述的目标越具体,你得到的答案就越具体。

        7
  •  0
  •   GHad    16 年前

    在爪哇中,您可以用XML数据(如实体bean)填充对象,然后使用XMLeNo编码器将其获取到XML。从那里,您可以使用XSLT进行进一步的转换,或者使用xmlcoder将其带回对象。

    格雷兹

    PS:见 http://ghads.wordpress.com/2008/09/16/java-to-xml-to-java/ 例如,对象到XML部分…从数据库到对象还可以有多种方式:JDBC、groovy数据集或GORM。ApacheCommonBean可以通过类似反射的方法帮助填充JavaBean。

        8
  •  0
  •   Flexo - Save the data dump sunny moon    13 年前

    我创建了一个解决这个问题的方法,它使用相当于邮件合并的方法,将结果集作为源,并使用一个模板将其合并以生成所需的XML。

    模板是标准XML,有一个header元素、一个footer元素和一个body元素。在body元素中使用一个CDATA块允许我包含一个完整的XML结构,该结构充当每行的模板。为了在模板中包含来自结果集的字段,我使用了类似这样的标记 <[FieldName]> .然后对模板进行预分析以隔离标记,以便在操作时,模板在生成主体时从结果集中请求每个字段。

    页眉和页脚元素在输出集的开始和结束处只输出一次。正文可以是任何所需的XML或文本结构。在您的例子中,听起来您可能有几个模板,每个模板对应一个所需的模式。

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