2016-03-24 3 views
-1

PHP-разработчики здесь ?? У меня есть функция PHP, которая анализирует XML-файл (используя DOMDocument, я профессионал с этим инструментом). Я хочу сделать то же самое с XMLReader, но я не понимаю, как работает XMLReader ...PHP - от DOMDocument до XMLReader

Я хочу использовать XMLReader, потому что это легкий инструмент.

Не стесняйтесь спрашивать у меня другие вопросы о моей проблеме.

function getDatas($filepath) 
{ 
    $doc = new DOMDocument(); 
    $xmlfile = file_get_contents($filepath); 
    $doc->loadXML($xmlfile); 

    $xmlcars = $doc->getElementsByTagName('car'); 
    $mycars= []; 

    foreach ($xmlcars as $xmlcar) { 
     $car = new Car(); 
     $car->setName(
      $xmlcar->getElementsByTagName('id')->item(0)->nodeValue 
     ); 
     $car->setBrand(
      $xmlcar->getElementsByTagName('brand')->item(0)->nodeValue 
     ); 

     array_push($mycars, $car); 
    } 
    return $mycars; 

} 

PS: Я не старший PHP-разработчик.

Ahah Thanks.

+1

И что вы попытались исправить проблему ', но я не понимаю, как работает XMLReader'? –

+0

слэш в 'new \ DOMDocument();' опечатка? – rvbarreto

+0

@rvbarreto да это была опечатка извините – KitchenLee

ответ

0

Это хороший пример от this topic, я надеюсь, что это поможет вам понять.

$z = new XMLReader; 
$z->open('data.xml'); 

$doc = new DOMDocument; 

// move to the first <product /> node 
while ($z->read() && $z->name !== 'product'); 

// now that we're at the right depth, hop to the next <product/> until the end of the tree 
while ($z->name === 'product') 
{ 
    // either one should work 
    //$node = new SimpleXMLElement($z->readOuterXML()); 
    $node = simplexml_import_dom($doc->importNode($z->expand(), true)); 

    // now you can use $node without going insane about parsing 
    var_dump($node->element_1); 

    // go to next <product /> 
    $z->next('product'); 
} 
0

XMLReader, насколько я могу судить, не имеет эквивалентного способа фильтрации по имени элемента. Таким образом, самым близким эквивалентом этого было бы, как упоминалось в ответе rvbarreto, перебирать все элементы с помощью XMLReader->read() и захватывать необходимую информацию, когда имя элемента совпадает с тем, что вы хотите. '

В качестве альтернативы вы можете захотеть проверить SimpleXML, который поддерживает фильтрацию с использованием выражений XPath, а также ищет узел в XML, используя структуру элементов, подобную им, являющимся под-объектами основного объекта. Например, вместо использования:

$xmlcar->getElementsByTagName('id')->item(0)->nodeValue; 

Вы могли бы использовать:

$xmlcar->id[0]; 

Предполагая, что все ваши car элементов на первом уровне дерева XML документа, должно работать в качестве примера:

function getDatas($filepath) { 

    $carsData = new SimpleXMLElement($filepath, NULL, TRUE); 

    $mycars = []; 

    foreach($carsData->car as $xmlcar) { 
     $car = new Car(); 
     $car->setName($xmlcar->id[0]); 
     $car->setBrand($xmlcar->id[0]); 
     $mycars[] = $car; 
    } 

}