2013-06-11 10 views
0

Я хотел бы получить значения тега в xml в array по php. Я использовал этот фрагмент:Получение списка значений тега из xml-файла

$images = parseXmlFileForTagName("Rambod_catalog.xml", "Thumbnail"); 
$prices = parseXmlFileForTagName("Rambod_catalog.xml", "Retail_Price"); 

echo $images[0], "   ", $prices[0]; 

/** 
* @param string $xmlFile 
* @param string $tagName 
* 
* @throws InvalidArgumentException 
* @return DOMNodeList 
*/ 
function parseXmlFileForTagName($xmlFile, $tagName) 
{ 
    $doc = new DomDocument; 
    $r = $doc->load($xmlFile); 
    if (!$r) { 
     throw new InvalidArgumentException(sprintf('Failed to load file %s', $xmlFile)); 
    } 

    return $doc->getElementsByTagName($tagName); 
} 

, но появляется сообщение об ошибке:

Fatal error: Cannot use object of type DOMNodeList as array in /path/to/index.php on line 400

Почему является причиной этой ошибки? Как я могу изменить свой код, чтобы исправить его?

+0

Вы получаете доступ к DOMNodeList как массив, который невозможен, он использует различную нотацию для доступа к значениям списка. Как описано в руководстве по php: http://php.net/domdocument.getelementsbytagname - вам необходимо изменить свой код, чтобы исправить его, но он действительно слишком локализован для ответа IMHO. – hakre

+1

Также не дублируйте свои вопросы: http://stackoverflow.com/questions/17037936/converting-xml-to-array-in-php – hakre

ответ

1

Проблема заключается в том, что вы используете DOMNodeList, как если бы это был массив. Однако, что конкретный тип не может быть использован с ArrayAccess:

echo $images[0], "   ", $prices[0]; 

Вот почему вы видите сообщение об ошибке. Возможно, вы захотите сначала преобразовать DOMNodeList в массив, что может быть сделано с помощью iterator_to_array, используя на DOMNodeList, который был ранее очерчен в соответствующем вопросе Implements DOMDocument to Array.

/** 
* @param string $xmlFile 

... 

* @return DOMElement[] 
*/ 
function parseXmlFileForTagName($xmlFile, $tagName) 
{ 

... 

    $elements = $doc->getElementsByTagName($tagName); 

    return iterator_to_array($elements, FALSE); 
} 

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

echo $images[0], "   ", $prices[0]; 

Так что вам нужно прочитать их nodeValue (как я предполагаю, что вы ищете это значение):

echo $images[0]->nodeValue, "   ", $prices[0]->nodeValue; 

И это должно сделай это. Однако, поскольку я также прокомментировал ваш другой (возможный дублирующий) вопрос, если вы используете simplexml вместо DOMDocument, это может быть проще, поскольку он имеет магический доступ к значениям узлов, поэтому вы можете напрямую эхо результата. Также вы можете просто получить доступ к одному или нескольким тегам, записав их имя. На самом деле нет необходимости в такой функции.

Смежные вопросы