【问题标题】:Accessing namespace Within XML to parse the correct data PHP/Laravel在 XML 中访问命名空间以解析正确的数据 PHP/Laravel
【发布时间】:2019-10-17 02:15:41
【问题描述】:

我目前正在尝试解析一些甜蜜的 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"]);
}

【问题讨论】:

  • 首先 - 这里没有命名空间。第二 - 格式化你的代码,在一行中是不可读的。
  • 对不起!我的条件可能在这里搞混了!我只需要提取英文描述
  • 该 XML 中不存在标签 property_desc!我们是否要忽略伪 xml 的那部分并专注于 php 中使用的标签?
  • 是的,请,还提供了 xml 的链接:)

标签: php xml laravel xml-parsing


【解决方案1】:

我构建了一个使用和提供 XML 的 API,所以我知道在 PHP 中使用 XML 是多么令人愉快。 /s

我创建了一个包,它特别支持 Laravel 将 XML 转换为常规 PHP 数组。它真的很容易使用,如果你喜欢的话,它还附带一个全局可访问的助手。 https://github.com/mtownsend5512/xml-to-array

它将使您可以轻松访问命名空间信息作为数组键@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@attributes。您可以循环遍历转换后的 XML,因为它是一个普通的 PHP 数组。

【讨论】:

    【解决方案2】:

    另一种解决方案是:

    <?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();
        }
    }
    

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

    【讨论】:

      【解决方案3】:

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

      下面会加载本地保存的 XML 数据副本 - 但您可以在调用 $dom-&gt;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;
          }
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        • 2021-04-06
        • 1970-01-01
        • 2012-08-28
        • 2010-11-08
        相关资源
        最近更新 更多