加载xml infile mysql

时间:2017-10-22 10:11:09

标签: php mysql xml

我正在尝试将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地址和第二条街道。主流的地址没有加载到DB中。

我如何更改我的MYSQL代码?

2 个答案:

答案 0 :(得分:0)

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

请改为尝试:

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

答案 1 :(得分:0)

考虑在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>