2009-11-29 4 views
4

J'utilise php et xmlreader pour récupérer des données à partir d'un fichier xml et les insérer dans une table mysql. J'ai choisi xmlreader car les fichiers fournis sont de 500mb. Je suis nouveau à tout cela et je suis à un point critique pour obtenir les données à insérer correctement dans la table mysql.en utilisant php xmlreader pour obtenir des données de xml à mysql

xml Exemple de fichier ...

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

Je lis le fichier XML à l'aide xmlreader et en utilisant expand() pour SimpleXML de flexibilité à obtenir les détails. Je ne pouvais pas comprendre comment faire ce que je voulais en utilisant strictement xmlreader.

Je souhaite que chaque enregistrement de la table mysql reflète les préfixes, stockNumber, attributePriority, AttributeName et AttributeValue.

Voici mon code jusqu'à présent ...

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

Si vous indentez votre code de 4 espaces SO l'affichera correctement. Je l'ai réparé pour toi. –

+0

Veuillez écrire un exemple d'entrée XML avec 2 éléments et le code SQL que vous souhaitez générer. Veuillez également indiquer quelle version de PHP vous utilisez et si vous pouvez utiliser MySQLi à la place de l'extension MySQL. –

Répondre

1

Je pense que this pourrait faire ce que vous voulez, ou tout au moins vous donner quelques idées sur la façon de progresser - je moquais quelques entrées supplémentaires dans le XML montrer comment il traite de divers problèmes qui pourraient survenir.

Notez le commentaire qui indique que, en raison des limitations du codepad, je n'ai pas utilisé la fonction d'échappement de chaîne idéale.

-1

Je ne suis pas un expert en manipulation XML en PHP mais je doute que votre code utilise DOM et simpleXML à la fois avec xmlReader. Donc, j'ai pensé vérifier ce que je peux vous suggérer. J'ai reçu ce code et cela me semble direct. Je vous suggère de vous concentrer sur cela pour l'amélioration. Il utilise DOM après XMLReader et après cela il utilise XPath de DOM comme vous le faites aussi.

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

?> 

Pour more.

Questions connexes