首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php中xml的解析

php中xml的解析
EN

Stack Overflow用户
提问于 2016-08-11 10:48:31
回答 2查看 77关注 0票数 1
代码语言:javascript
复制
<aws:TrafficHistoryResponse xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/">
<aws:Response xmlns:aws="http://awis.amazonaws.com/doc/2005-07-11">
<aws:OperationRequest>
<aws:RequestId>0effb937-80d1-431d-80c2-95a883de1040</aws:RequestId>
</aws:OperationRequest>
<aws:TrafficHistoryResult>
<aws:Alexa>
<aws:TrafficHistory>
<aws:Range>2</aws:Range>
<aws:Site>http://xeler8.com/</aws:Site>
<aws:Start>2016-03-01</aws:Start>
<aws:HistoricalData>
<aws:Data>
<aws:Date>2016-03-01</aws:Date>
<aws:PageViews>
<aws:PerMillion>0.06</aws:PerMillion>
<aws:PerUser>1.00</aws:PerUser>
</aws:PageViews>
<aws:Rank>339328</aws:Rank>
<aws:Reach>
<aws:PerMillion>5</aws:PerMillion>
</aws:Reach>
</aws:Data>
<aws:Data>
<aws:Date>2016-03-02</aws:Date>
<aws:PageViews>
<aws:PerMillion>0.03</aws:PerMillion>
<aws:PerUser>1.00</aws:PerUser>
</aws:PageViews>
<aws:Rank>686679</aws:Rank>
<aws:Reach>
<aws:PerMillion>2</aws:PerMillion>
</aws:Reach>
</aws:Data>
</aws:HistoricalData>
</aws:TrafficHistory>
</aws:Alexa>
</aws:TrafficHistoryResult>
<aws:ResponseStatus xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/">
<aws:StatusCode>Success</aws:StatusCode>
</aws:ResponseStatus>
</aws:Response>

这是我想在php中解析的响应,希望获取Rank节点的值。

代码语言:javascript
复制
$xml = new SimpleXMLElement($response,null,false,
                            'http://awis.amazonaws.com/doc/2005-07-11');
echo $xml->TrafficHistoryResponse->Response->TrafficHistoryResult->Alexa->TrafficHistory->HistoricalData->Data->Rank;

使用此方法,但无法获得数据获取错误的

PHP注意:在第100行的/home/ras-al/下载/urlinfo.php中尝试获取非对象的属性

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-11 14:13:56

首先,您的XML文档在结束时缺少了关闭的aws:TrafficHistoryResponse标记。

可以检索Rank节点的文本值,如下所示:

代码语言:javascript
复制
$xml = new SimpleXMLElement($response);
$xml->registerXPathNamespace('a', 'http://awis.amazonaws.com/doc/2005-07-11');

foreach ($xml->xpath("//a:Rank") as $rank) {
    echo $rank . PHP_EOL;
}

输出:

339328 686679

票数 1
EN

Stack Overflow用户

发布于 2016-08-11 13:22:06

您的XML文件无效,请在文档末尾添加以下2行:

代码语言:javascript
复制
</aws:Response>
</aws:TrafficHistoryResponse>

诀窍是执行$response = str_replace("aws:","",$response);以避免命名空间的问题:)

在这里,完整的代码:

代码语言:javascript
复制
$response ='<aws:TrafficHistoryResponse xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/">
        <aws:Response xmlns:aws="http://awis.amazonaws.com/doc/2005-07-11">
            <aws:OperationRequest>
                <aws:RequestId>0effb937-80d1-431d-80c2-95a883de1040</aws:RequestId>
            </aws:OperationRequest>
            <aws:TrafficHistoryResult>
                <aws:Alexa>
                    <aws:TrafficHistory>
                        <aws:Range>2</aws:Range>
                        <aws:Site>http://xeler8.com/</aws:Site>
                        <aws:Start>2016-03-01</aws:Start>
                        <aws:HistoricalData>
                            <aws:Data>
                                <aws:Date>2016-03-01</aws:Date>
                                <aws:PageViews>
                                    <aws:PerMillion>0.06</aws:PerMillion>
                                    <aws:PerUser>1.00</aws:PerUser>
                                </aws:PageViews>
                                <aws:Rank>339328</aws:Rank>
                                <aws:Reach>
                                    <aws:PerMillion>5</aws:PerMillion>
                                 </aws:Reach>
                             </aws:Data>
                            <aws:Data>
                                <aws:Date>2016-03-02</aws:Date>
                                <aws:PageViews>
                                    <aws:PerMillion>0.03</aws:PerMillion>
                                    <aws:PerUser>1.00</aws:PerUser>
                                </aws:PageViews>
                                <aws:Rank>686679</aws:Rank>
                                <aws:Reach>
                                    <aws:PerMillion>2</aws:PerMillion>
                                </aws:Reach>
                            </aws:Data>
                        </aws:HistoricalData>
                    </aws:TrafficHistory>
                </aws:Alexa>
            </aws:TrafficHistoryResult>
            <aws:ResponseStatus xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/">
            <aws:StatusCode>Success</aws:StatusCode>
            </aws:ResponseStatus>
        </aws:Response>
</aws:TrafficHistoryResponse>';

$response = str_replace("aws:","",$response);
try { 
    $xml = new SimpleXmlElement($response);
} catch (Exception $e) { 
    echo $e; 
}
$data = $xml->xpath("//TrafficHistoryResponse/Response/TrafficHistoryResult/Alexa/TrafficHistory/HistoricalData/Data[last()]");
print_r($data[0]->Rank);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38894275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档