【问题标题】:PHP foreach statement issue with accessing XML data访问 XML 数据的 PHP foreach 语句问题
【发布时间】:2017-04-21 20:43:46
【问题描述】:

首先,我对 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 语句类似的代码,但一无所获。任何帮助将不胜感激,宠物也将不胜感激!

【问题讨论】:

    标签: php json xml 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"]
    }
    

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

    在我看来,将这种结构化信息转换为关联数组是有问题的。为什么?为什么不是简单的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 中由[...])。数组仅用于其中的两组非结构化字符串:照片和视频。这更合乎逻辑,一旦你考虑一下......

    【讨论】:

    • 谢谢!我会尝试您对json_encode($animal) 的建议。我很感激有时间回答我的问题!效果很好!。我正在处理的页面获取了这个 json 数据,然后我预编译了一个车把模板来加载当前可供收养的宠物。我通过每小时在 php 文件上运行一个 cron 作业来保持 json 数据的最新状态。如果您可能感兴趣,这里是演示页面的链接。 demo
    • @Macsupport 一个漂亮的网站,毫无疑问。恭喜!我自己不喜欢养宠物的想法,我反对它,看到所有这些动物保护区都充满了悲伤的生物,我感到很难过。对于非常具体的任务或远在乡下的人们来说,情况肯定会有所不同。但对于绝大多数人来说,我个人认为避免这种习惯是一种整体积极的态度。
    【解决方案2】:

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

    你可能根本不需要 for 循环。

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多