【问题标题】:load xml infile mysql加载 xml infile mysql
【发布时间】:2017-10-22 10:11:08
【问题描述】:

我正在尝试将 xml 文件加载到 mysql。
我的 XML 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<TEST>
    <DATABASE>
        <CUSTOMERS>
            <CUSTOMER l_name="aa" f_name="aaaa">
                <adr>
                    <street txt="mainstreet" zipcode="11111"/>
                </adr>
                <adr>
                    <street txt="secondstreet" zipcode="11111"/>
                </adr>                
            </CUSTOMER>
            <CUSTOMER l_name="bb" f_name="bbbb">
                <adr>
                    <street txt="teststreet" zipcode="22222"/>
                </adr>
            </CUSTOMER>            
            <CUSTOMER l_name="cc" f_name="cccc"/>
        </CUSTOMERS>
    </DATABASE>
</TEST>

我在mysql中导入文件的代码是:

LOAD XML LOCAL INFILE '/Applications/MAMP/htdocs/uebung/customer.xml'
INTO TABLE customer
ROWS IDENTIFIED BY '<CUSTOMER>';  

所以它起作用了。但是,如果我有两个客户地址,那么它只需要数据库中的最后一个。也就是说,它只为具有第二条街道地址的l_name = aa 的客户加载。主流的地址没有加载到数据库中。

我必须如何更改我的 MYSQL 代码?

【问题讨论】:

    标签: php mysql xml


    【解决方案1】:

    使用CUSTOMER作为记录节点:ROWS IDENTIFIED BY '&lt;CUSTOMER&gt;', 每个&lt;CUSTOMER&gt; 标签内的每个属性标签都必须是唯一的,因此如果您两次声明同一个节点(在本例中为&lt;adr&gt;),第二个节点的值将覆盖第一个节点的值。所以你基本上嵌套了太多次了。

    试试这个:

    <TEST>
        <DATABASE>
            <CUSTOMERS>
                <CUSTOMER l_name="aa" f_name="aaaa">
                    <adr>
                        <street txt="mainstreet" zipcode="11111"/>
                    </adr>
                </CUSTOMER>
                <CUSTOMER l_name="aa" f_name="aaaa">
                    <adr>
                        <street txt="secondstreet" zipcode="11111"/>
                    </adr>                
                </CUSTOMER>
                <CUSTOMER l_name="bb" f_name="bbbb">
                    <adr>
                        <street txt="teststreet" zipcode="22222"/>
                    </adr>
                </CUSTOMER>            
                <CUSTOMER l_name="cc" f_name="cccc"/>
            </CUSTOMERS>
        </DATABASE>
    </TEST>
    

    【讨论】:

    • 感谢您的回复。问题是我得到了这种格式的 XML,就像我在我的问题中写的那样。有没有其他机会解决它。我之前用 PHP 尝试过,但它非常复杂,因为这个 xml 只是一个简单的例子。实际上,xml 文件可能更加嵌套。那就是如果有可能我想直接在mysql中做。
    【解决方案2】:

    考虑在 PHP 中运行 XSLT 将原始 XML 转换为 MySQL 您需要的格式。

    XSLT (另存为.xsl文件,特殊的.xml文件)

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
        <xsl:strip-space elements="*"/>
    
        <!-- IdentityTransform -->
        <xsl:template match="@* | node()">
            <xsl:copy>
                <xsl:apply-templates select="@* | node()" />
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="CUSTOMER[*[name(*)!='addr']]">
            <xsl:apply-templates select="*" />
        </xsl:template>
    
        <xsl:template match="adr">
            <xsl:element name="CUSTOMER">
              <xsl:copy-of select="ancestor::CUSTOMER/@l_name"/>
              <xsl:copy-of select="ancestor::CUSTOMER/@f_name"/>
              <xsl:copy>
                 <xsl:copy-of select="*"/> 
              </xsl:copy>
            </xsl:element>
        </xsl:template>
    
    </xsl:stylesheet>
    

    PHP (使用php-xsl 类)

    // Set current path
    $cd = dirname(__FILE__);
    
    // Load the XML source and XSLT file    
    $xml = new DOMDocument('1.0', 'UTF-8');   
    $xml->load($cd.'/Source.xml');
    
    $xsl = new DOMDocument;
    $xsl->load($cd.'/XSLTScript.xsl');
    
    // Transform the original xml
    $proc = new XSLTProcessor;
    $proc->importStyleSheet($xsl); 
    
    $newXml = $proc->transformToXML($xml);
    
    // Save output to file
    $xmlfile = $cd.'/Output.xml';
    file_put_contents($xmlfile, $newXml);
    

    输出 (在 MySQL 的 LOAD DATA XML 命令中使用 Output.xml)

    <TEST>
      <DATABASE>
        <CUSTOMERS>
          <CUSTOMER l_name="aa" f_name="aaaa">
            <adr>
              <street txt="mainstreet" zipcode="11111"/>
            </adr>
          </CUSTOMER>
          <CUSTOMER l_name="aa" f_name="aaaa">
            <adr>
              <street txt="secondstreet" zipcode="11111"/>
            </adr>
          </CUSTOMER>
          <CUSTOMER l_name="bb" f_name="bbbb">
            <adr>
              <street txt="teststreet" zipcode="22222"/>
            </adr>
          </CUSTOMER>
          <CUSTOMER l_name="cc" f_name="cccc"/>
        </CUSTOMERS>
      </DATABASE>
    </TEST>
    

    【讨论】:

      猜你喜欢
      • 2011-01-28
      • 1970-01-01
      • 2010-10-22
      • 2011-05-25
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多