访问XML数据的PHP foreach语句问题

时间:2016-12-07 02:30:04

标签: php json xml foreach

首先,我对PHP很无能为力,所以要善良!我正在为一个SPCA工作(我是一个兽医和兼职极客)。 PHP从用于管理掩体的门户访问xml文件并存储图像信息。该文件将xml数据写入JSON,然后我在把手模板等中使用JSON数据。我在从xml文件中获取一些数据以打印到JSON时遇到问题。

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声明,但我无处可去。任何帮助将不胜感激,宠物也会欣赏它!

2 个答案:

答案 0 :(得分: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"]
}

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

在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中由[...])。数组仅用于那里的两个非结构化字符串集:照片和视频。一旦你想到它,这就更合乎逻辑了......

答案 1 :(得分:0)

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

您可能根本不需要循环。