Laravel 5.6解析多维JSON仅显示单条数据问题求助
问题:Laravel中使用Orchestral XmlParser仅能解析出一条Domain数据
我先感谢大家查看我的问题,如果这个问题有重复我深表歉意,我已经搜索过但没找到匹配的问题。我在Laravel 5.6.21里用Orchestral的XmlParser解析数据时遇到了麻烦:试了各种循环方法,但始终只能显示一条数据。
我的JSON数据示例:
{ "domain": [ { "Domain": "countoftuscany.com", "Created": "04/02/2018", "IsOurDNS": "false", "Expired": "04/02/2019" }, { "Domain": "gnesarssssis.com", "Created": "04/01/2018", "IsOurDNS": "false", "Expired": "04/02/2019" }, { "Domain": "gnesarssis.com", "Created": "04/01/2018", "IsOurDNS": "false", "Expired": "04/01/2019" }, { "Domain": "gnesarssi.com", "Created": "04/01/2018", "IsOurDNS": "false", "Expired": "04/01/2019" }, { "Domain": "gnesarsi.com", "Created": "04/01/2018", "IsOurDNS": "false", "Expired": "04/01/2019" }, { "Domain": "iniituadas.com", "Created": "04/01/2018", "IsOurDNS": "false", "Expired": "04/01/2019" } ], "Perpage": "50", "Total": "91", "CurPage": "1" }
我的PHP代码:
public function getList($page = null) { if (!$page) {$page = 1;} $cache = 'DOMAIN-'.Auth::user()->id.'-'.$page; if (Cache::has($cache)) { $hasil = Cache::get($cache); return $hasil; $data = json_decode(json_encode($hasil)); // foreach ($data as $key) { // dd($key); // } // return view('namecheap.show', compact('hasil')); } else { $url = $this->urlNc().'&Command=namecheap.domains.getList&ClientIp=119.81.31.23&PageSize=50&SortBy=EXPIREDATE_DESC&Page='.$page; $resp = Curl::to($url)->get(); $xml = XmlParser::extract($resp); $hasil = $xml->parse([ 'domain' => ['uses' => 'CommandResponse.DomainGetListResult.Domain[::Name>Domain,::Created>Created,::IsOurDNS>IsOurDNS,::Expires>Expired]','default' => null], ]); Cache::put($cache, $hasil, 10); return $hasil; return view('namecheap.show', compact('hasil')); } }
我希望获取所有"domain"数据并展示出来,恳请各位帮忙解决这个问题,我已经尝试了所有我知道的方法。
解决方案
我看你问题的核心出在XmlParser的解析规则上,另外代码里还有个小逻辑错误,咱们一步步来改:
1. 修复XmlParser的解析规则,获取所有Domain节点
你当前的解析规则里,Domain[::Name>Domain,...]只会匹配到第一个Domain节点,要遍历所有节点,得加上.*来表示匹配所有子元素:
$hasil = $xml->parse([ 'domain' => ['uses' => 'CommandResponse.DomainGetListResult.Domain.*[::Name>Domain,::Created>Created,::IsOurDNS>IsOurDNS,::Expires>Expired]', 'default' => []], ]);
这样修改后,$hasil['domain']就会是包含所有域名数据的数组了。
2. 修正缓存分支的逻辑错误
你在缓存存在的分支里,先执行了return $hasil;,这会导致后面的代码(包括返回视图的逻辑)完全不会执行。应该把返回视图的代码放在前面:
if (Cache::has($cache)) { $hasil = Cache::get($cache); return view('namecheap.show', compact('hasil')); }
同样,在else分支里,return $hasil;也会阻止后面返回视图的代码运行,你可以把这行删掉,或者调整顺序让视图返回作为最后一步。
3. 在视图中遍历展示数据
当你正确拿到所有数据后,在namecheap.show视图里就可以用foreach循环来遍历所有域名了:
@foreach($hasil['domain'] as $domain) <div class="domain-item"> <h3>{{ $domain['Domain'] }}</h3> <ul> <li>创建时间: {{ $domain['Created'] }}</li> <li>是否使用我方DNS: {{ $domain['IsOurDNS'] }}</li> <li>过期时间: {{ $domain['Expired'] }}</li> </ul> </div> @endforeach
这样应该就能正常展示所有域名数据啦!
内容的提问来源于stack exchange,提问作者Rafi Halilintar
相关产品推荐
相关产品推荐

