2016-12-07 4 views
0

Во-первых, я довольно невежественный с PHP, поэтому будьте добрыми! Я работаю над сайтом для SPCA (я - ветеринар и специалист по частичной работе). PHP обращается к XML-файлу с портала, используемого для администрирования приюта и хранения изображений, информации. Файл записывает данные xml в JSON, а затем я использую данные JSON в шаблоне дескрипторов и т. Д. У меня возникла проблема с получением некоторых данных из xml-файла для вывода на JSON.Проблема с выпуском PHP foreach с доступом к данным XML

файл XML, как это:

</DataFeedAnimal>  
<AdditionalPhotoUrls> 
<string>doc_73737.jpg</string> 
<string>doc_74483.jpg</string> 
<string>doc_74484.jpg</string> 
</AdditionalPhotoUrls> 
<PrimaryPhotoUrl>19427.jpg</PrimaryPhotoUrl> 
<Sex>Male</Sex> 
<Type>Cat</Type> 
<YouTubeVideoUrls> 
<string>http://www.youtube.com/watch?v=6EMT2s4n6Xc</string>  
</YouTubeVideoUrls> 
</DataFeedAnimal> 

В файле PHP, написанный другом, код ниже, (только часть), для доступа к данным XML и записать его в формате JSON :

<?php 

    $url = "http://eastbayspcapets.shelterbuddy.com/DataFeeds/AnimalsForAdoption.aspx"; 
if ($_GET["type"] == "found") { 
$url = "http://eastbayspcapets.shelterbuddy.com/DataFeeds/foundanimals.aspx"; 
} else if ($_GET["type"] == "lost") { 
$url = "http://eastbayspcapets.shelterbuddy.com/DataFeeds/lostanimals.aspx"; 
} 

$response_xml_data = file_get_contents($url); 
$xml = simplexml_load_string($response_xml_data); 
$data = array(); 

foreach($xml->DataFeedAnimal as $animal) 
{ 
$item = array(); 
$item['sex'] = (string)$animal->Sex; 
$item['photo'] = (string)$animal->PrimaryPhotoUrl; 
$item['videos'][] = (string)$animal->YouTubeVideoUrls; 
$item['photos'][] = (string)$animal->PrimaryPhotoUrl; 
foreach($animal->AdditionalPhotoUrls->string as $photo) { 
     $item['photos'][] = (string)$photo; 
    } 

$item['videos'] = array(); 
$data[] = $item; 
} 

echo file_put_contents('../adopt.json', json_encode($data)); 
echo json_encode($data); 
?> 

выход JSON работает хорошо, но я не могу получить «видео», чтобы записать в файл JSON как «фото» делать. Я просто получаю '/ n'!

Поскольку друга, который помог с этим, уже не вокруг, я застрял. Я пробовал аналогичный код для утверждения foreach для фотографий, но я никуда не уходил. Любая помощь будет оценена, и домашние животные тоже оценят это!

ответ

1

Трюк с такими реализациями - это всегда смотреть, что у вас есть, сбрасывая структуры данных в файл журнала или в командную строку. Затем взгляните на документацию о данных, которые вы видите. Таким образом, вы точно знаете, с какими данными вы работаете и как с ним работать ;-)

Здесь выясняется, что интересующие вас видеоролики размещаются внутри объекта типа SimpleXMLElement с общедоступными объектами, не удивительно, если вы посмотрите на структуру xml. Документация класса SimpleXMLElement показывает метод children(), который выполняет итерацию через всех дочерних элементов. Только то, что мы ищем ...

Это означает чистую реализацию, чтобы получить доступ к этим наборы должны идти вдоль этих линий:

foreach($animal->AdditionalPhotoUrls->children() as $photo) { 
    $item['photos'][] = (string)$photo; 
} 
foreach($animal->YouTubeVideoUrls->children() as $video) { 
    $item['videos'][] = (string)$video; 
} 

Взгляните на это полное и рабочий пример:

<?php 
$response_xml_data = <<< EOT 
<DataFeedAnimal> 
    <AdditionalPhotoUrls> 
    <string>doc_73737.jpg</string> 
    <string>doc_74483.jpg</string> 
    <string>doc_74484.jpg</string> 
    </AdditionalPhotoUrls> 
    <PrimaryPhotoUrl>19427.jpg</PrimaryPhotoUrl> 
    <Sex>Male</Sex> 
    <Type>Cat</Type> 
    <YouTubeVideoUrls> 
    <string>http://www.youtube.com/watch?v=6EMT2s4n6Xc</string> 
    <string>http://www.youtube.com/watch?v=hgfg83mKFnd</string> 
    </YouTubeVideoUrls> 
</DataFeedAnimal> 
EOT; 

$animal = simplexml_load_string($response_xml_data); 

$item = []; 
$item['sex'] = (string)$animal->Sex; 
$item['photo'] = (string)$animal->PrimaryPhotoUrl; 
$item['photos'][] = (string)$animal->PrimaryPhotoUrl; 
foreach($animal->AdditionalPhotoUrls->children() as $photo) { 
    $item['photos'][] = (string)$photo; 
} 
$item['videos'] = []; 
foreach($animal->YouTubeVideoUrls->children() as $video) { 
    $item['videos'][] = (string)$video; 
} 

echo json_encode($item); 

очевидный выход из этого:

{ 
    "sex":"Male", 
    "photo":"19427.jpg", 
    "photos" ["19427.jpg","doc_73737.jpg","doc_74483.jpg","doc_74484.jpg"], 
    "videos":["http:\/\/www.youtube.com\/watch?v=6EMT2s4n6Xc","http:\/\/www.youtube.com\/watch?v=hgfg83mKFnd"] 
} 

Я хотел бы, однако, добавить короткую подсказку:

В м глаза сомнительно преобразовать такую ​​структурированную информацию в ассоциативный массив. Зачем? Почему бы не просто json_encode($animal)? Конструкция прекрасно и должна быть легко работать!Вывод, что было бы:

{ 
    "AdditionalPhotoUrls":{ 
    "string":[ 
     "doc_73737.jpg", 
     "doc_74483.jpg", 
     "doc_74484.jpg" 
    ] 
    }, 
    "PrimaryPhotoUrl":"19427.jpg", 
    "Sex":"Male", 
    "Type":"Cat", 
    "YouTubeVideoUrls":{ 
    "string":[ 
     "http:\/\/www.youtube.com\/watch?v=6EMT2s4n6Xc", 
     "http:\/\/www.youtube.com\/watch?v=hgfg83mKFnd" 
    ] 
    } 
} 

Этой структура описывает объектов (детали с внутренней структурой, заключенной в JSON с помощью {...}), а не только произвольных массивов (наборов без структуры, заключенной в JSON с помощью a [...]). Массивы используются только для двух неструктурированных наборов строк: фотографии и видео. Это гораздо логичнее, как только вы об этом подумаете ...

+0

Спасибо! Я попробую ваше предложение 'json_encode ($ animal)'. Я ценю время, чтобы ответить на мой вопрос! Работает хорошо!. Страница, над которой я работаю, принимает данные json, а затем я предварительно скомбинирую шаблон руля, чтобы загрузить текущие домашние животные, доступные для принятия. Я сохраняю данные json текущими, ежечасно запуская работу cron в файле php. Вот вам ссылка на демонстрационную страницу, если вам это интересно. [demo] (http://yourvets.com/docs/cardsJ.html) – Macsupport

+0

@Macsupport Красивый веб-сайт, без вопросов. Поздравления! Я сам не прихожу к мысли о том, чтобы иметь домашнее животное, я выступаю против него, и мне грустно видеть, что все эти святилища животных наполнены грустными существами. Вещи, безусловно, разные для очень специфических задач или для людей, живущих далеко за пределами страны. Но для подавляющего большинства людей я лично думаю, что избегать этой привычки - это общее позитивное отношение. – arkascha

0

Предполагая, что данные XML и данные JSON должны иметь одинаковую структуру. Я бы посмотрел на это: PHP convert XML to JSON

Возможно, вам не нужны петли.

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