использование php xmlreader для получения данных из xml в mysql

Я использую php и xmlreader для извлечения данных из файла xml и вставки в таблицу mysql. Я выбрал xmlreader, потому что предоставленные мне файлы весят 500 МБ. Я новичок во всем этом и нахожусь в камне, чтобы правильно вставить данные в таблицу 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>

Я читаю файл xml с помощью xmlreader и использую 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;'>";
   }    
}
?>

person Mike    schedule 29.11.2009    source источник
comment
Если вы сделаете отступ в своем коде на 4 пробела, SO отобразит его правильно. Я исправил это для вас.   -  person Jim Garrison    schedule 29.11.2009
comment
Пожалуйста, опубликуйте образец ввода XML с двумя элементами и соответствующим SQL, который вы хотите сгенерировать. Также укажите, какую версию PHP вы используете и можете ли вы использовать MySQLi вместо расширения MySQL.   -  person Josh Davis    schedule 29.11.2009


Ответы (3)


Я думаю, что это может сделать то, что вы хотите, или, по крайней мере, дать вам некоторые идеи о том, как продвигаться вперед - я смоделировал некоторые дополнительные записи в XML, чтобы показать, как он справляется с различными проблемами, которые могут возникнуть.

Обратите внимание на комментарий, в котором указано, что из-за ограничений кодовой панели я не использовал идеальную функцию экранирования строки.

person TML    schedule 30.12.2010

Я не эксперт в манипулировании XML в PHP, но я сомневаюсь, что ваш код использует DOM и simpleXML как с xmlReader. Итак, я подумал проверить, что я могу предложить вам. Я получил этот код, и это выглядит прямо для меня. Я предлагаю вам сосредоточиться на этом для улучшения. Он использует DOM после XMLReader, а после этого использует XPath DOM, как и вы.

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

?>

дополнительные сведения.

person Satya Prakash    schedule 19.01.2011

Можете ли вы проверить SimpleXMLElement? это хорошая альтернатива

person Eray    schedule 08.01.2011