【问题标题】:How to convert a xml file to sql query如何将xml文件转换为sql查询
【发布时间】:2015-06-02 00:51:01
【问题描述】:

我需要一些关于将 xml 文件转换为 sql 查询文件的帮助。可以转换吗?

<mob_proto isOldStructure="false">
    <Mob vnum="101" name="??" localizedname="Cão Selvagem" type="0" rank="0" battle_type="0" level="1" event_type="0" mob_color="0" />
</mob_proto>

【问题讨论】:

  • 看看 XSLT,它是一种将 xml 转换为任何其他类型(即 HTML、文本、SQL、PDF 等)的转换语法。您编写一个 xsl 文件,您可以将其与您的 xml 文件一起使用以将其转换为 SQL(虽然不是自动的,您必须编写您的选择)
  • 我不是 100% 确定我了解您想要做什么。此 XML 片段是否表示针对数据库中的表进行查询(SELECT 语句)的条件?还是要将 XML 本身转换为数据库中的表?
  • 您可以做的另一件事是将 xml 文件加载到 MySQL 中的全文字段中,并使用其 extractvalue() 函数运行 xpath 查询
  • 您使用的是什么 SQL 引擎?有些具有解析 XML 的本机支持。否则,您将需要使用其他语言(XSLT 很明显,但也有其他可能性)。我们需要有关您的平台的更多信息。

标签: sql xml converter


【解决方案1】:

为了让您了解如何使用 XSLT 来执行此操作,请考虑以下样式表:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="text" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

    <xsl:template match="//Mob">
        SELECT * 
        FROM <xsl:value-of select="local-name()" /> 
        WHERE vnum = <xsl:value-of select="@vnum" />
            AND name = '<xsl:value-of select="@name" />'
    </xsl:template>

</xsl:transform>

这会将任何 Mob 元素转换为选择查询,使用“Mob”作为表名,并过滤 vnum 和 name 作为列名。你可以在这里玩这个: http://xsltransform.net/nc4NzQA

这种方法的优点:

  • XSLT 是一种定义明确的基于标准的语言,具有广泛的平台支持。
  • XSLT 将非常巧妙地处理许多特定于 XML 的问题
  • 您可以将所有查询转换逻辑保存在一个地方

缺点:

  • 您的查询可能仅限于特定的语法/平台
  • XSLT 很难学好,您的团队可能难以维护

另一个选择是将您的 XML 传递给您的数据库引擎。例如,如果您使用 SQL Server,您可以编写一个存储过程,该过程接受一个 XML 参数,然后使用 OPENXML (https://msdn.microsoft.com/en-us/library/ms175160.aspx) 来提取/解析发送进来的 XML。Postgres 也支持 XML:@ 987654323@,Mysql 也是如此:http://dev.mysql.com/doc/refman/5.5/en/load-xml.html,我相信 Oracle 也是如此。

这种方法的优点:

  • 对于不了解 XSLT 的精通 SQL 开发人员而言,学习曲线可能不会那么陡峭
  • 可能能够更有效地将数据直接加载到数据库中(以 XML 格式保存或分解为表)

缺点:

  • 支持因数据库平台而异
  • 可能会给您的数据库服务器带来额外的处理压力,而另一台机器上的 XSLT 处理器可以更有效地处理这些压力(尤其是在您处理复杂的文档结构时)。

当然,您也可以使用任意数量的其他自定义实用程序来执行此操作,但 XSLT 或 SQL XML 支持可能是您最好的选择。

【讨论】:

    猜你喜欢
    • 2012-12-18
    • 1970-01-01
    • 2020-07-19
    • 2021-10-11
    • 2017-10-29
    • 2015-04-21
    • 2019-04-24
    • 2016-03-28
    • 1970-01-01
    相关资源
    最近更新 更多