phpとxmlreaderを使用して、xmlファイルからデータを取得し、mysqlテーブルに挿入しています。提供されたファイルが500MBであるため、xmlreaderを選択しました。私はこれらすべてに不慣れであり、データを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ファイルを読み取り、詳細を取得する際の柔軟性のためにexpand()を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;'>";
}
}
?>