【问题标题】:Extracting data from simplexml_load_file not working从 simplexml_load_file 中提取数据不起作用
【发布时间】:2014-08-19 21:10:01
【问题描述】:

我一直坚持从 xml 文件中获取值,我决定使用 simplexml,因为它使生活更轻松,但 atm 却相反。

我的 xml 文件看起来像这样:

<?xml version="1.0"?>
<fslb server="12345">
<statistics>
    <frontend-connections>145</frontend-connections>
    <global-response-time-average>1899ms</global-response-time-average>
    <ecm-blacklist-size>0</ecm-blacklist-size>
    <backend-connections>0 of 0</backend-connections>
    <global-max-response-time>6888ms</global-max-response-time>     
    <global-ecm-cache-size>2396</global-ecm-cache-size>
    <global-queue-length>0</global-queue-length>
    <global-sidless-poll-average>0.00</global-sidless-poll-average>
    <actual-card-requests>0</actual-card-requests>
    <sid-sidless-requests>75% [109]/24% [36]</sid-sidless-requests>
    <invalidated-clients>0</invalidated-clients>
    <global-queue-average>0.00</global-queue-average>
    <global-max-sidless-polls>0</global-max-sidless-polls>
    <average-requests-per-card>0.00</average-requests-per-card>
    <global-cache-efficiency>0%</global-cache-efficiency>
    <total-requests-received>102934</total-requests-received>
</statistics>
<active-users>
    <user name="RS.DOS" unread-messages="0" ipaddress="xxxx" client="Mgcamd" loggedonsince="2014-08-18 06:01:03p" requests="338" period=" 8.53" sid="0695" service-name="INT" request-handling="Queued in GC (External)" hop-list="[0]: None" hash="DE:26" latency="1900" />
    <user name="S9" unread-messages="0" ipaddress="xxxx" client="Mgcamd" loggedonsince="2014-08-18 06:01:03p" requests="263" period="10.97" sid="0174" service-name=" XD" request-handling="Queued in GC (External)" hop-list="[0]: None" hash="80:C0" latency="748" />
    <user name="M1" unread-messages="0" ipaddress="174.93.86.83" client="Newcamd" loggedonsince="2014-08-18 06:01:03p" requests="12844" period=" 0.22" sid="0688" service-name="INT" request-handling="Global Cached CWs" hop-list="[0]: None" hash="4A:3F" latency="0" />
    <user name="S9" unread-messages="0" ipaddress="xxxx" client="Mgcamd" loggedonsince="2014-08-18 06:01:03p" requests="300" period=" 9.61" sid="0650" service-name="INT" request-handling="Queued in GC (External)" hop-list="[0]: None" hash="8A:4C" latency="909" />
</active-users>

&lt;/fslb&gt;

我的最终目标是从一个“用户”行(或统计行)中提取数据并将其输出到 mysql 以便将其保存在我的数据库中。输出部分似乎很容易,但是我什至无法首先提取要提取的数据-.-。这是我的 php 代码:

ini_set("user_agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
ini_set("max_execution_time", 0);
ini_set("memory_limit", "10000M");
$file_xml = "users.xml";
if(!file_exists($file_xml))
{
    exit('Failed to open');
}

$fslb = simplexml_load_file($file_xml, 'SimpleXMLElement',LIBXML_NOCDATA);
$json_string = json_encode($fslb);  
$result_array = json_decode($json_string, TRUE);
//print_r($fslb);
echo('<p> Total number of connections: ');
echo $result_array->statistics[0]->{'frontend-connections'};
echo('</p>');
echo('<p> Global-response-time-average: ');
echo $result_array->statistics[0]->{'global-response-time-average'};
echo('</p>');

我花了好几个小时试图弄清楚如何提取一些数据,但它就是不成功!

SimpleXMLElement Object ( [@attributes] => Array ( [server] => 12345 ) [statistics] => SimpleXMLElement Object ( [frontend-connections] => 145 [global-response-time-average] => 1899ms [ecm-blacklist-size] => 0 [backend-connections] => 0 of 0 [global-max-response-time] => 6888ms [global-ecm-cache-size] => 2396 [global-queue-length] => 0 [global-sidless-poll-average] => 0.00 [actual-card-requests] => 0 [sid-sidless-requests] => 75% [109]/24% [36] [invalidated-clients] => 0 [global-queue-average] => 0.00 [global-max-sidless-polls] => 0 [average-requests-per-card] => 0.00 [global-cache-efficiency] => 0% [total-requests-received] => 102934 ) [active-users] => SimpleXMLElement Object ( [user] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [name] => RS.DOS [unread-messages] => 0 [ipaddress] => xxxx [client] => Mgcamd [loggedonsince] => 2014-08-18 06:01:03p [requests] => 338 [period] => 8.53 [sid] => 0695 [service-name] => INT [request-handling] => Queued in GC (External) [hop-list] => [0]: None [hash] => DE:26 [latency] => 1900 ) ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [name] => S9 [unread-messages] => 0 [ipaddress] => xxxx [client] => Mgcamd [loggedonsince] => 2014-08-18 06:01:03p [requests] => 263 [period] => 10.97 [sid] => 0174 [service-name] => XD [request-handling] => Queued in GC (External) [hop-list] => [0]: None [hash] => 80:C0 [latency] => 748 ) ) [2] => SimpleXMLElement Object ( [@attributes] => Array ( [name] => M1 [unread-messages] => 0 [ipaddress] => 174.93.86.83 [client] => Newcamd [loggedonsince] => 2014-08-18 06:01:03p [requests] => 12844 [period] => 0.22 [sid] => 0688 [service-name] => INT [request-handling] => Global Cached CWs [hop-list] => [0]: None [hash] => 4A:3F [latency] => 0 ) ) [3] => SimpleXMLElement Object ( [@attributes] => Array ( [name] => S9 [unread-messages] => 0 [ipaddress] => xxxx [client] => Mgcamd [loggedonsince] => 2014-08-18 06:01:03p [requests] => 300 [period] => 9.61 [sid] => 0650 [service-name] => INT [request-handling] => Queued in GC (External) [hop-list] => [0]: None [hash] => 8A:4C [latency] => 909 ) ) ) ) )

【问题讨论】:

  • 这个service-name=" XD" 包含一个空格。是否有所作为service-name="XD" - 和period=" 8.53"
  • 是的,我看到了,但即使有或没有空格,我的代码也无法正常工作 D:
  • 您为什么不查看print_r 输出?您转换为全数组结构。因此,您的 $result_array-&gt;statistics 会发出通知。启用 error_reporting。
  • 在我的 php.ini 中:error_reporting = E_ALL 它已启用 o.o 编辑:我已经使用 simplexml 帖子编辑了我的帖子

标签: php xml extract


【解决方案1】:

这对我有用

var_dump((string)$fslb->statistics->{"frontend-connections"});

http://php.net/manual/en/simplexmlelement.tostring.php

【讨论】:

  • 谢谢,至少我到了某个地方,但只是一个问题,我得到 string(3) "145" 作为回复。我怎么才能得到 145?
  • string(3) - 是 var_dump 的输出。如果你写下 $a = (string)$fslb->statistics->{"frontend-connections"};,你会得到 145
  • AFAIK SimpleXMLElement 没有任何方法返回节点的值。因此,获得它的唯一方法是将其转换为字符串(或您需要的其他类型)。
  • 天哪,它成功了!我做了你所说的关于 $a = ... 的事情!非常感谢!!!!
  • 对不起,如果我可以问最后一个问题:我做了 var_dump((string) $fslb->{'active-users'}->user[0]['name']);作为回报,我得到了我想要的 string(6) "RS.DOS"。但是,如果我想搜索一个名称,假设“S9”是我要搜​​索的名称,并且我想从该名称中提取整行,你会怎么做呢?因为这个 xml 文件是动态的,它每秒都在变化,我要搜索的用户并不总是在第一个数组中。
猜你喜欢
  • 2018-05-31
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 2015-02-12
相关资源
最近更新 更多