You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:08:53