【问题标题】:Import XML file into MySql database with multivariable attributes将 XML 文件导入具有多变量属性的 MySql 数据库
【发布时间】:2022-01-05 07:58:39
【问题描述】:

我正在将一个 XML 文件从 Internet 导入我的 MySQL 数据库,但我遇到了一些问题,因为它包含一些多变量属性。例如,每个项目可能有 1 个“类别”标签或 3 个。在数据库关系中,这个属性应该形成自己的表,但我不知道如何连接这样的东西。下面是我正在处理的一个简短示例。

<Library>
    <Book>
        <Author> Dave </Author>
        <Title> XML Help </Title>
        <Category> Computers </Category>
        <Category> XML </Category>
    </Book>
</Library>

我知道下面的基本语法

LOAD XML LOCAL INFILE 'file.xml' INTO TABLE table ROWS IDENTIFIED BY '<Value>';

这假设每个属性只有一个值。我无法编辑 xml 文件,因为它有数十万行长,无论如何我都希望自动化这个过程。感谢您的帮助。

【问题讨论】:

  • 你检查过manual
  • LOAD XML 在没有额外处理的情况下无法加载此类文件。
  • 加载 xml 一次只能用于填充一个表。使用上面的 xml 文件,您可以通过两次运行创建一个 books 和一个 categories 表,但是它将无法填充两个表之间的联结表。您需要使用外部编程语言处理xml文件。

标签: mysql sql xml


【解决方案1】:

考虑使用XSLT 转换您的XML,XSLT 是一种声明性和特殊用途的语言,如SQL,专门用于转换XML 文档。由于mysql CLI 可以使用system\! 运行shell commands,因此您可以在命令行调用已安装的XSLT 处理器或运行准备好的(和编译的)通用语言(Java、Python、PHP、等)命令行中的脚本。

假设您需要将原始输入转换为以下内容,其中不同的类别被分成不同的&lt;Book&gt; 节点。

<?xml version="1.0" encoding="UTF-8"?>
<Library>
   <Book>
      <Author>Dave</Author>
      <Title>XML Help</Title>
      <Category>Computers</Category>
   </Book>
   <Book>
      <Author>Dave</Author>
      <Title>XML Help</Title>
      <Category>XML</Category>
   </Book>
</Library>

在 XSLT 下运行。请参阅 Online Demo

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
    </xsl:template>
    
    <xsl:template match="Book">
       <xsl:apply-templates select="Category"/>
    </xsl:template>
    
    <xsl:template match="Category">
     <Book>
       <xsl:apply-templates select="preceding-sibling::Author"/>
       <xsl:apply-templates select="preceding-sibling::Title"/>
       <xsl:copy>
        <xsl:apply-templates select="node()"/>
       </xsl:copy>
     </Book>
    </xsl:template>

    <xsl:template match="text()">
       <xsl:apply-templates select="normalize-space()"/>
    </xsl:template>
    
</xsl:stylesheet>

然后,从mysql CLI 调用shell commands

  • 使用 Unix 的 xsltproc

    mysql> system xsltproc myScript.xsl Input.xml > Output.xml
    
  • 使用 Windows 的 System.Xml.Xsl(参见 Powershell 脚本 here

    mysql> system Powershell.exe -File "PS_Script.ps1" "Input.xml" "myScript.xsl" "Output.xml"
    
  • 调用通用语言(参见 XSLT 脚本here):

    mysql> system java run_xslt
    mysql> system python run_xslt.py
    mysql> system php run_xslt.php
    mysql> system perl run_xslt.pl
    mysql> system Rscript run_xslt.R
    

最后,使用转换后的文档运行LOAD XML

LOAD XML LOCAL INFILE 'myTranformedOutput.xml' 
  INTO TABLE mytable 
  ROWS IDENTIFIED BY '<Book>';

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2012-12-23
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多