2017-10-22 8 views
0

私はxmlファイルをmysqlにロードしようとしています。
私のXMLは以下のようになります。load xml infile mysql

<?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>'; 

だから、それは動作します。しかし、私は顧客のための2つのアドレスがある場合、それはデータベースの最後のものだけをとります。つまり、l_name = aaの住所を2番目の通りに置き、顧客のために読み込むだけです。メインストリームのアドレスはDBにロードされません。

MYSQLコードをどのように変更する必要がありますか? ROWS IDENTIFIED BY '<CUSTOMER>'、あなたは(この場合、<adr>に)二度同じノードを宣言した場合、2番目のノードの値は、最初のノードのを上書きするように、すべての<CUSTOMER>タグの内側の各プロパティタグは、一意である必要があります :レコードノードなどの顧客を使用して

答えて

0

値。基本的には何度も入れ子になっています。

代わりにこれを試してみてください:

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

ご回答いただきありがとうございます。問題は、自分の質問に書いたように、この形式でXMLを取得することです。それを解決する他のチャンスはありませんか?私はPHPでこれまでに試しましたが、このXMLは単なる例に過ぎないため、非常に複雑です。実際には、xmlファイルはより多くネストすることができます。つまり、mysqlで直接実行したい場合は可能です。 – kartal

0

はあなたが必要とするMySQLの 形式に元のXMLを変換するためにPHPでXSLTを実行することを検討してください。

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> 

PHPphp-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でOutput.xmlを使用するのLOAD DATA 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> 
関連する問題