2013-03-20 4 views
0

Я пытаюсь использовать SimpleXML для анализа XML-файла, созданного на экспорт Google Reader.Анализ экспорта Google Reader

пример файла:

<?xml version="1.0" encoding="UTF-8"?> 
<opml version="1.0"> 
    <head> 
     <title>TheTechBox subscriptions in Google Reader</title> 
    </head> 
    <body> 
     <outline text="Engadget RSS Feed" title="Engadget RSS Feed" 
      type="rss" xmlUrl="http://www.engadget.com/rss.xml" htmlUrl="http://www.engadget.com"/> 
     <outline text="xkcd.com" title="xkcd.com" type="rss" 
      xmlUrl="http://xkcd.com/rss.xml" htmlUrl="http://xkcd.com/"/> 
    </body> 
</opml> 

Это то, что я пытался до сих пор, пользователь загружает файл в эту форму и форму необходимо перебрать и извлечения данных.

<?php 
if ($_FILES["file"]["error"] > 0) 
{ 
    echo "Error: " . $_FILES["file"]["error"] . "<br>"; 
} 
else 
{ 

    $import = new SimpleXMLElement($_FILES["file"]["name"]); 

    foreach($import->opml->body->outline[0] as $feed){ 
     echo $feed["title"]; 
    } 

} 
?> 

Сейчас хром выдает ошибку сервера, который указывает на то, очень неправильно на странице, файл загрузки ОК, так что, как представляется, SimpleXml часть.

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

Любая обратная связь будет принята с благодарностью.

Вот рабочий код в конце

$import = simplexml_load_file($_FILES["file"]["tmp_name"]); 

foreach($import->body->outline as $feed){ 
    echo $feed["title"]; 
} 

Это нужно для добавления разобрать все данные, но это работает.

+0

Какая ошибка возникает у вас? 500 человек? И попытались ли вы вывести содержимое '$ _FILES [" file "] [" name "]', чтобы убедиться, что оно действительно? –

+1

'simplexml_load_file ($ _ FILES [" file "] [" tmp_name "]);' – Wrikken

+0

@TomWalters Да, это ошибка 500, и да, файл должен быть действительным, поскольку я попытался просто отбросить основные данные файла на страницу раньше, и это работал. –

ответ

2

Вы попали в классическую ловушку при использовании SimpleXML: первый объект, который вы получаете при разборе файла или строки, не является абстрактным «документом», а родительским узлом. В этом случае родительский узел равен <opml> ... </opml>, поэтому $import в вашем примере кода - это <opml> узел. Другими словами, вместо $import->opml->body вам просто нужно сказать $import->body.

Там другая ошибка в цикле, а также, что является то, что вы просите первый <outline> элемента (->outline[0]), когда то, что вы хотите, чтобы цикл над все элементов (foreach($whatever->outline as $feed)).

+0

Бинго! Удаление [0] теперь означает, что он проходит через все и удаляет часть opml. Я добавлю рабочий код в конец вопроса. –

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