2016-12-07 38 views
0

首先,我对PHP非常无知,所以要善良!我正在为一个SPCA(我是一名兽医和一名兼职极客)的网站工作。 PHP从门户网站访问一个xml文件,用于管理收容所和存储图像信息。该文件将xml数据写入JSON,然后在句柄模板等中使用JSON数据。我从xml文件中获取一些数据以将结果打印到JSON时遇到问题。PHP与访问XML数据的foreach语句问题

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

这种实现的诀窍就是始终通过将数据结构转储到日志文件或命令行来查看所获得的结果。然后看看你看到的数据的文档。这样你就知道你正在使用什么数据以及如何使用它;-)

在这里你发现你感兴趣的视频URL被放置在一个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"] 
} 

然而,我想添加一个简短的提示:

在m眼中,将这种结构化信息转换为关联数组是值得商榷的。为什么?为什么不是简单的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一个[...])。数组仅用于那里的两个非结构化字符串集合:照片和视频。这是更合乎逻辑的,一旦你想起它...

+0

谢谢!我会尝试一下'json_encode($ animal)'的建议。我很欣赏时间来回答我的问题!效果很好!。我正在处理的页面需要这个json数据,然后我预编译一个句柄模板来加载可供采用的当前宠物。我通过在php文件上每小时运行一次cron作业来保持json数据最新。如果你有兴趣的话,这里是演示页面的链接。 [demo](http://yourvets.com/docs/cardsJ.html) – Macsupport

+0

@Macsupport一个漂亮的网站,在那里毫无疑问。恭喜!我自己并不喜欢有宠物动物的想法,我反对它,让我很难过看到所有那些充满伤感生物的动物保护区。对于非常具体的任务或居住在乡村地区的人来说,事情肯定是不同的。但对于绝大多数人来说,我个人认为避免这种习惯是一种总体积极的态度。 – arkascha

0

假设XML数据和JSON数据旨在具有相同的结构。我会看看这个:PHP convert XML to JSON

你可能根本不需要循环。