mysql xml veri almak için php xmlreader kullanarak

3 Cevap php

Ben bir xml dosyasından veri retreive ve bir mysql tabloya eklemek için php ve xmlreader kullanıyorum. Dosyaları bana 500mb olduğu sağlanan çünkü xmlreader seçti. Ben tüm bu yeni ve mysql tabloya düzgün eklemek için veri alma düğüm noktası duyuyorum.

Dosyasından örnek 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>

Ben xmlreader kullanarak xml dosyası okuma ve ayrıntılar almak esneklik SimpleXMLElement () genişletmek kullanan duyuyorum. Ben kesinlikle xmlreader kullanarak istediğini nasıl çözemedim.

Ben mysql tablosunun her kayıt önek, StockNumber, attributePriority, attributeName ve attributeValue yansıtmak istiyoruz.

İşte benim kod öylesine uzak ...

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

3 Cevap

I this ne istiyorsun düşünüyorum, ya da en azından ilerleme konusunda bazı fikirler vermek - Ben o kadar gelebileceğini, çeşitli konuları ele nasıl göstermek için XML bazı ek girişlerini alay.

Nedeniyle kod takımı sınırlamaları nedeniyle, ben ideal bir dize kaçan işlevini kullanmak vermedi, işaret Yorumu unutmayın.

Ben PHP XML manipülasyon hiçbir uzman değilim ama DOM ve SimpleXML xmlReader hem kullanarak kodunuzu şüpheliyim. Yani, ben sana önerebilirsiniz ne kontrol düşündüm. Ben bu kodu var ve bu düz görünüyor bana. Ben iyileştirilmesi için bu konsantre öneririz. XMLReader sonra DOM kullanarak ve sonra da yapıyorsun gibi DOM, XPath kullanıyor olmasıdır.

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

?>

Için more.

Kontrol edebilirsiniz SimpleXMLElement? Bu iyi bir alternatiftir