2015-09-18 1 views
0

Я искал решение для этого, но не могу найти его нигде.Анализ XML с помощью PHP DOMDocument

Я пытаюсь разобрать файл XML, но некоторые TagNames отсутствуют в XML. Некоторые сообщения предполагают использование длины объекта, но это тоже не работает.

if ($xmlObject->item($i)->getElementsByTagName('image1')->item(0)->childNodes->item(0)->length > 0) { 
    $product_image1 = $xmlObject->item($i)->getElementsByTagName('image1')->item(0)->childNodes->item(0)->nodeValue; 
} else { 
    $product_image1 = ""; 
} 

Notice: Trying to get property of non-object in /home/s/public_html/import_xml.php on line 72

Fatal error: Call to a member function item() on a non-object in /home/s/public_html/import_xml.php on line 72

Ошибка в том, что <image1> отсутствует в XML.

Любые идеи по исправлению?

+0

Необходимо, чтобы операторы if, чтобы проверить, существует ли каждый элемент в цепочке xml, которую вы вызываете. –

+0

Это то, что я пытался сделать с длиной> 0. Так как это не сработало, как я могу проверить, существует ли он? если isset? –

+1

все в порядке, но вы не можете использовать -> length, если какой-либо из родительских узлов не существует. вы в основном должны проверять каждый уровень дерева, чтобы убедиться, что он действительно существует. –

ответ

0

Вот как я это сделал. Не уверен, что это «лучший» способ, но он работает ...

foreach ($xmlDoc->getElementsByTagName('product')->item($i)->childNodes as $node) { 
    if ($node->nodeType === XML_ELEMENT_NODE) { 
     $nodes[] = $node->nodeName; 
     echo "Processing node " . $node->nodeName . "<br />"; 
    } 
} 

if (in_array("name", $nodes)) { 
    $product_name = $xmlObject->item($i)->getElementsByTagName('name')->item(0)->childNodes->item(0)->nodeValue; 
} else { 
    $product_name = ""; 
}