2017-02-11 11 views
0

私はBill Of Materialsテーブルを作成しています。私のXMLの親ノードは、私たちが作っている製品であり、子どもたちは、BOMラインは、次のような親の製品情報と一緒に行の各BOMLine製品コードを単一を挿入するためにPHPを使用して、私の最終目標 子供の親とループを持つmysqlに複数の行を作成する

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

を例えばれます。

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

これは私が今までに持っているコードですが、私はこのような方法で親情報を取得できません。私は信じZ

答えて

0

私は正しい方法であなたを理解し、あなたがしようとしたコードに基づいている場合、 :

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

クエリを実行すると、私はいくつかのデータを取得しますが、すべての親の製品は、各行の空であります

$BOMXml->BOM->ProductName 

foreachループの前に親製品を取得することができます。

0

XSLTとSQLの2つの宣言型特殊言語を使用することを検討してください。 MySQLはLOAD XMLコマンドを使用してXMLファイルをデータベーステーブルに直接インポートする機能を提供するため、PHPにraw XMLを変換してMySQLインポート用の単純なフラット構造に変換させます(変換ノードは列名に揃えます)。

ここでは、反復的な追加クエリのループを回避します。 XSLT 1.0スクリプトを実行するには、.iniファイルに拡張子php_xslが有効になっている必要があります。また、mysql_*はPHP 7で完全に削除された非推奨のライブラリであるため、SQL呼び出しでは事前に初期化されていると想定されているmysqliライブラリが使用されるため注意してください。 libxsltとMySQLの2つのエンジンをお楽しみください!

PHP(埋め込みXSLT及びSQLコードで)

$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>';"); 
関連する問題