【问题标题】:Using SimpleXMLElement with PHP将 SimpleXMLElement 与 PHP 一起使用
【发布时间】:2016-03-08 02:42:45
【问题描述】:

我正在尝试从我的 XML 文件中检索一些值:

<lx:message xsi:schemaLocation="http://api.latx.corp.netapp.com/ws/schema/1.0/wsmessage.xsd">
    <lx:header>
      <lx:status>success</lx:status>
    </lx:header>
  <lx:results>
    <lx:perf_data>
       <lx:perfid>331070</lx:perfid>
       <lx:filepath>/x/eng/cs-data1/latx/prd/20151009_uploads/akshayp/AIo.data</lx:filepath>
       <lx:filename>AIo.data</lx:filename>
       <lx:datatype>perf8</lx:datatype>
       <lx:userid>akshayp</lx:userid>
 .
 .
 .

我想检索&lt;lx:userid&gt;中的值

我的代码是:

<?php

                            $response = file_get_contents('http://www.myapi.com/myxml.xml');
                            $response = new SimpleXMLElement($response);

                            echo $response->{'lx:message'}->{'lx:results'}->{'lx:perf_data'}->{'lx:userid'};


                    ?>

但我收到如下错误:

试图在第 116 行的 C:\wamp\www\1\simple.php 中获取非对象的属性

有人可以帮忙吗,我已经尝试了很多方法来获得解决方案,但仍然失败。

谢谢。

【问题讨论】:

  • 因为lx 是一个命名空间,而不是标签名的一部分。
  • 但是我仍然没有通过使用 echo $response->{'message'}->{'results'}->{'perf_data'}->{'userid'} 得到想要的输出;

标签: php simplexml


【解决方案1】:

使用SimpleXMLElement::getNamespaces 获取命名空间uri,然后使用SimpleXMLElement::children 来“进入”这个命名空间。

<?php
$response = new SimpleXMLElement( data() );
$namespaces = $response->getNamespaces(true);
$nsLX = $namespaces['lx'];
echo $response->children($nsLX)->results->perf_data->userid;

function data() {
    return <<< eox
<lx:message xmlns:lx="foo">
    <lx:header>
        <lx:status>success</lx:status>
    </lx:header>
  <lx:results>
        <lx:perf_data>
            <lx:perfid>331070</lx:perfid>
            <lx:filepath>/x/eng/cs-data1/latx/prd/20151009_uploads/akshayp/AIo.data</lx:filepath>
            <lx:filename>AIo.data</lx:filename>
            <lx:datatype>perf8</lx:datatype>
            <lx:userid>akshayp</lx:userid>
        </lx:perf_data>
    </lx:results>
</lx:message>
eox;
}

【讨论】:

  • 无需调用-&gt;getNamespaces()。如果您想让您的代码对文件格式的更改保持稳健,请从 xmlns:lx 属性中找到 URL 并对其进行硬编码;如果您不介意稍后修复它,请使用-&gt;children('lx', true),PHP 将根据前缀进行匹配。
猜你喜欢
  • 2011-06-14
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
相关资源
最近更新 更多