2009-11-29 83 views
4

我使用php和xmlreader從xml文件中檢索數據並插入到mysql表中。我選擇了xmlreader,因爲我提供的文件是500MB。我對所有這些都陌生,並且正處於一個棘手的問題,即要將數據正確插入到MySQL表中。從文件使用php xmlreader從xml獲取數據到mysql

示例XML ...

<us:ItemMaster> 
    <us:ItemMasterHeader> 
    <oa:ItemID agencyRole="Prefix_Number" > 
     <oa:ID>CTY</oa:ID> 
    </oa:ItemID> 
    <oa:ItemID agencyRole="Stock_Number_Butted" > 
     <oa:ID>TN2100</oa:ID> 
    </oa:ItemID> 
    <oa:Specification> 
     <oa:Property sequence="3" > 
     <oa:NameValue name="Color(s)" >Black</oa:NameValue> 
     </oa:Property> 
     <oa:Property sequence="22" > 
     <oa:NameValue name="Coverage Percent " >5.00 %</oa:NameValue> 
     </oa:Property> 
    </oa:Specification> 
    </us:ItemMasterHeader> 
</us:ItemMaster> 

我使用的XMLReader讀取XML文件,並利用擴張()來的SimpleXML靈活地獲取詳情。我無法弄清楚如何使用嚴格的xmlreader來完成我想要的操作。

我想每個記錄的mysql表反映前綴,stockNumber,attributePriority,AttributeName和AttributeValue。

這裏是我到目前爲止的代碼...

<?php 
$reader = XMLReader::open($file); 

while ($reader->read()) { 
    if ($reader->nodeType == XMLREADER::ELEMENT && 
    $reader->localName == 'ItemMasterHeader') { 
    $node = $reader->expand(); 
    $dom = new DomDocument(); 
    $n = $dom->importNode($node,true); 
    $dom->appendChild($n); 
    $sxe = simplexml_import_dom($n); 

    foreach ($sxe->xpath("//oa:Property[@sequence]") as $Property) { 
     $AttributePriority = $Property[@sequence]; 
     echo "(" . $AttributePriority . ") "; 

     $Prefix = $sxe->xpath("//oa:ItemID[@agencyRole = 'Prefix_Number']/oa:ID"); 
     foreach ($Prefix as $Prefix) { 
     echo $Prefix; 
     } 

     $StockNumber = $sxe->xpath("//oa:ItemID[@agencyRole  ='Stock_Number_Butted']/oa:ID"); 
      foreach ($StockNumber as $StockNumber) { 
     echo $StockNumber; 
     } 
    } 
    foreach ($sxe->xpath("//oa:NameValue[@name]") as $NameValue) { 
    $AttributeName = $NameValue[@name]; 
    echo $AttributeName . " "; 
    } 
    foreach ($sxe->xpath("//oa:NameValue[@name]") as $NameValue) { 
    $AttributeValue = $NameValue; 
    echo $AttributeValue . "<br/>"; 
    } 

// mysql insert 
mysql_query("INSERT INTO $table (Prefix,StockNumber,AttributePriority,AttributeName,AttributeValue) 
VALUES('$Prefix','$StockNumber','$AttributePriority','$AttributeName','$AttributeValue')");    
} 
    if($reader->nodeType == XMLREADER::ELEMENT && $reader->localName == 'ItemMaster') { 
    // visual seperator between products 
    echo "<hr style = 'color:red;'>"; 
    }  
} 
?> 
+0

如果您將代碼縮進4個空格,將會正確顯示它。我已經爲你修好了。 – 2009-11-29 02:15:56

+0

請發佈包含2個項目的示例XML輸入以及您想要生成的相應SQL。還請提及您使用的是哪個版本的PHP,以及您是否可以使用MySQLi代替MySQL擴展。 – 2009-11-29 06:26:43

回答

1

我想this可以做你想做的,或者至少給你如何進展的一些想法 - 我嘲笑了一些其他的項目在XML中展示它如何處理可能出現的各種問題。

請注意指出,由於鍵盤的限制,我沒有使用理想的字符串轉義函數。

-1

我不是PHP中的XML操作專家,但我懷疑你的代碼使用DOM和simpleXML與xmlReader。所以,我想檢查一下我可以向你推薦的東西。我得到了這段代碼,這看起來很直截了當。我建議你專注於改善。在XMLReader之後使用DOM,之後它正在使用DOM的XPath。

<?php 

// Parsing a large document with XMLReader with Expand - DOM/DOMXpath 
$reader = new XMLReader(); 

$reader->open("tooBig.xml"); 

while ($reader->read()) { 
    switch ($reader->nodeType) { 
     case (XMLREADER::ELEMENT): 
     if ($reader->localName == "entry") { 
      if ($reader->getAttribute("ID") == 5225) { 
       $node = $reader->expand(); 
       $dom = new DomDocument(); 
       $n = $dom->importNode($node,true); 
       $dom->appendChild($n); 
       $xp = new DomXpath($dom); 
       $res = $xp->query("/entry/title"); 
       echo $res->item(0)->nodeValue; 
      } 
     } 
    } 
} 

?> 

對於more