我使用php和xmlreader从xml文件中检索数据,并将其插入到mysql表中。我选择了xmlreader,因为我提供的文件是500mb的。我对所有这一切都是新手,现在的问题是如何将数据正确地插入到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表中的每个记录都能反映prefix、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;'>";
}
}
?>
发布于 2010-12-31 07:59:46
我认为this可能会做您想做的事情,或者至少为您提供一些如何进行的想法-我模拟了XML中的一些附加条目,以展示它如何处理可能出现的各种问题。
注意,注释指出,由于codepad的限制,我没有使用理想的字符串转义函数。
发布于 2011-01-19 19:29:07
我不是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。
发布于 2011-01-09 07:25:48
你能查一下SimpleXMLElement吗?这是一个很好的选择
https://stackoverflow.com/questions/1814426
复制相似问题