2017-10-22 2 views
0

Ich versuche, XML-Datei in mysql zu laden.
Meine XML sieht unten wie:laden 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> 

Mein Code die Datei zu importieren in der mysql ist:

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

So funktioniert es. Aber wenn ich zwei Adressen für einen Kunden habe, dann ist es nur der letzte in der Datenbank. Das heißt, es lädt nur für den Kunden mit der Adresse l_name = aa die Adresse mit der zweiten Straße. Die Adresse mit Mainstream ist nicht in der DB geladen.

Wie muss ich meinen MYSQL-Code ändern?

Antwort

0

Mit CUSTOMER als Datensatzknoten: ROWS IDENTIFIED BY '<CUSTOMER>', jede Eigenschaft Tag innerhalb eines jeden <CUSTOMER>-Tag eindeutig sein müssen, so dass, wenn Sie den gleichen Knoten zweimal (in diesem Fall <adr>) erklären, den Wert des zweiten Knoten des ersten Knotens überschreibt Wert. Du hast also im Grunde zu viele Male verschachtelt.

Versuchen Sie stattdessen:

<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

Vielen Dank für Ihre Antwort. Das Problem ist, dass ich das XML in diesem Format bekomme, wie ich es in meiner Frage geschrieben habe. Gibt es keine andere Chance, es zu lösen? Ich habe es vorher mit PHP versucht, aber es ist sehr kompliziert, weil diese XML nur ein einfaches Beispiel ist. In Wirklichkeit könnte die XML-Datei verschachtelter sein. Wenn es möglich ist, möchte ich es direkt in mysql tun. – kartal

0

Betrachten XSLT in PHP läuft Ihre ursprüngliche XML in das Format, das Sie MySQL müssen zu transformieren.

XSLT(speichern als XSL-Datei, eine spezielle XML-Datei)

<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(mit php-xsl Klasse)

// 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); 

Ausgabe(Verwenden Sie Output.xml in MySQL ‚S LOAD DATA XML Befehl)

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