2017-02-11 1 views
0

Ich mache eine Bill Of Materials Tabelle. Meine XML übergeordneten Knoten ist das Produkt, das wir machen, und die Kinder werden die BOM Linien beispielsErstellen Sie mehrere Zeilen in mysql mit Eltern und Schleife von Kindern XML mit PHP

<BOM> 
<ProductName>This</ProductName> 
<BOMLines> 
    <BOMLine> 
    <ProductCode>Widget-1</ProductCode> 
    <Qty>111</Qty> 
    </BOMLine> 

    <BOMLine> 
    <ProductCode>Widget-2</ProductCode> 
    <Qty>222</Qty> 
    </BOMLine> 

    <BOMLine> 
    <ProductCode>Widget-3</ProductCode> 
    <Qty>333</Qty> 
    </BOMLine> 
</BomLines> 
</BOM> 

Mein Endziel, PHP für Zeile ein einzelnes einzufügen jedes BOMLine Produktcode zusammen mit dem übergeordneten Produktinformationen als solche;

TABLE bom 
id  productCode  lineCode  qty 
1  PROD-1   Widget-1  111 
2  PROD-1   Widget-2  222 
3  PROD-1   Widget-3  333 

Dies ist der Code, den ich bisher habe, aber ich kann nicht die Elterninformationen auf diese Weise arbeiten;

function updateBOM() { 
$BOMXml = getBOMs(''); 

foreach ($BOMXml->BOM->BOMLines->BOMLine as $BOM) { 

    $BOMLine = $BOM->ProductCode; 
    $BOMQty = $BOM->Qty; 
    $ParentProduct = $BOMXML->BOM->ProductName 


    $sql = "INSERT INTO bom (productCode, lineCode, Qty) VALUES ('$ParentProduct', '$BOMLine', '$BOMQty')"; 

    $retval = mysql_query($sql); 

     if(! $retval) { 
     die('Could not enter data: ' . mysql_error()); 
     } 
    $count += '1'; 
} 

Abfrage ausgeführt wird, erhalte ich einige Daten, aber alle Eltern Produkt ist in jeder Zeile leer ist: z

Antwort

0

Wenn ich Sie in einem richtigen Weg zu verstehen und basieren auf dem Code, den Sie versucht, Ich glaube,

$BOMXml->BOM->ProductName 

„vor“ der foreach-Schleife: Sie können durch das übergeordnete Produkt.

0

Verwenden Sie zwei deklarative Spezialsprachen: XSLT und SQL! Da MySQL die Möglichkeit bietet, XML-Dateien mit dem Befehl LOAD XML direkt in Datenbanktabellen zu importieren, lassen Sie PHP reines XML in eine vereinfachte flache Struktur für den MySQL-Import transformieren (wobei transformierte Knoten an Spaltennamen ausgerichtet sind).

Hier vermeiden Sie eine Schleife von iterativen Append-Abfragen. Zum Ausführen von XSLT 1.0-Skripten benötigt PHP die Erweiterung php_xsl, die in der INI-Datei aktiviert ist. Beachten Sie außerdem, dass mysql_* eine veraltete Bibliothek ist, die vollständig in PHP 7 entfernt wurde. SQL-Aufruf verwendet die Bibliothek mysqli, von der angenommen wird, dass sie vorinitialisiert ist. Viel Spaß beim Aufruf der beiden Engines: libxslt und MySQL!

PHP(mit eingebettetem XSLT und SQL-Code)

$doc = new DOMDocument(); 
$doc->load('Input.xml'); 

$xsl = new DOMDocument(); 
$xsl->loadXML('<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
       <xsl:output version="1.0" encoding="UTF-8" indent="yes" method="xml"/> 
       <xsl:strip-space elements="*"/> 

        <xsl:template match="/BOM"> 
        <data> 
         <xsl:apply-templates select="BOMLines"/> 
        </data> 
        </xsl:template> 

        <xsl:template match="BOMLine"> 
        <row> 
         <productCode><xsl:value-of select="ancestor::BOM/ProductName"/></productCode> 
         <lineCode><xsl:value-of select="ProductCode" /></lineCode> 
         <qty><xsl:value-of select="Qty"/></qty> 
        </row> 
        </xsl:template> 

       </xsl:transform>'); 

// INITIALIZE AND CONFIGURE TRANSFORMER 
$proc = new XSLTProcessor; 
$proc->importStyleSheet($xsl);  

// TRANSFORM XML SOURCE 
$newXML = $proc->transformToXML($doc); 

// SAVE CONTENT TO FILE 
file_put_contents('/Output.xml', $newXML); 

// RUN SQL COMMAND (IMPORTING FILE WITH FULL PATH REFERENCE) 
$mysqli->query("LOAD XML LOCAL INFILE '/path/to/Output.xml' 
       INTO TABLE bom 
       ROWS IDENTIFIED BY '<row>';"); 
Verwandte Themen