在XML中访问名称空间以解析正确的数据PHP / Laravel

时间:2019-05-31 12:13:28

标签: php xml laravel xml-parsing

我目前正在尝试解析一些甜美的XML,只是意识到我不知道如何访问命名空间,我需要解析英文。

有人帮助一个兄弟x

链接到xml = https://xml.inmobalia.com/361/e55d03759a1004da29b3e364faaff2e1.xml

例如

<property>
    <descriptions>
        <property_desc lang="en">
        </property_desc>  
        <property_desc lang="es">
        </property_desc>  
    </descriptions>
</property>

PHP-这是我尝试过的

foreach ($data as $key => $val) {
    $filterd[$key]['main_advert_1'] = json_encode([
        "main_advert" => (isset($val['descriptions']['long_description']['en'])
            and !empty($val['descriptions']['long_description']['en'])
        )
        ? $val['descriptions']['long_description']['en'] : "N.A"]);
}

3 个答案:

答案 0 :(得分:0)

不知道Laravel是否拥有自己的XML处理方法,但是在PHP中使用原始的DOMDocumentDOMXPath,提取所需项是一项简单的任务。

以下内容加载了XML数据的本地保存副本-但您可以在调用$dom->load( $url )等中使用url代替

<?php
    $file='c:/wwwroot/files/xml/e55d03759a1004da29b3e364faaff2e1.xml';
    define('br','<br />');

    libxml_use_internal_errors( true );
    $dom=new DOMDocument;
    $dom->validateOnParse=false;
    $dom->recover=true;
    $dom->strictErrorChecking=false;
    $dom->load( $file );
    libxml_clear_errors();


    $xp=new DOMXPath( $dom );
    $col=$xp->query('//descriptions/long_description[@lang="en"]');

    if( $col->length > 0 ){
        foreach( $col as $node )echo $node->tagName . ' ' .$node->nodeValue . br;
    }
?>

答案 1 :(得分:0)

另一个解决方案是:

<?php

$xml = simplexml_load_file('https://xml.inmobalia.com/361/e55d03759a1004da29b3e364faaff2e1.xml')->children();
foreach ($xml->xpath('/properties/property') as $property) {
    echo '<h2>'.$property->reference->__toString().'</h2>';
    foreach ($property->xpath('descriptions/long_description[@lang="en"]') as $property) {
        echo $property->__toString();
    }
}

使用此解决方案,您还可以访问属性的其他详细信息。

答案 2 :(得分:0)

我构建了一个使用并提供XML的API,因此我知道在PHP中使用XML会带来多大的乐趣。 / s

我创建了一个特别支持Laravel将XML转换为常规PHP数组的软件包。它真的很容易使用,并且如果您愿意的话,还提供了可全局访问的帮助程序。 https://github.com/mtownsend5512/xml-to-array

它将使您可以轻松地访问名称空间信息,作为数组键mtcars[8:11] <- lapply(mtcars[8:11], factor) 。因此,例如,要获取第一个长描述语言,您可以执行以下操作:

@attributes

您将看到$xml = file_get_contents('https://xml.inmobalia.com/361/e55d03759a1004da29b3e364faaff2e1.xml'); $result = xml_to_array($xml); dd($result['property'][0]['descriptions']['long_description']); @content。您可以循环遍历转换后的XML,因为它是纯PHP数组。