【问题标题】:Confused on how to read xml object returned by curl in php对如何读取 php 中 curl 返回的 xml 对象感到困惑
【发布时间】:2011-06-10 00:48:10
【问题描述】:

这是我的 php 代码:

<?php   
if (array_key_exists("site", $_GET) && $_GET["site"] != "" )
{ 
    $url = $_REQUEST['site'];
    $url = " http://api.mywot.com/0.4/public_query2?target=";   
    $result= $url.urlencode($url); 
    $process = curl_init($result); 
    //init curl connection
    curl_setopt($process, CURLOPT_HEADER, 0);    
    curl_setopt($process, CURLOPT_POST, 1); 
    curl_setopt($process, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($process,CURLOPT_CONNECTTIMEOUT,1);
    $resp = curl_exec($process); 
    curl_close($process); 
    header('Content-Type: text/xml');
    $xml = new SimpleXMLElement($resp);
}
?>

假定的 xml:

<?xml version="1.0" encoding="UTF-8"?>
 <query target="example.com">
   <application name="0" r="89" c="44"/>
   <application name="1" r="89" c="46"/>
   <application name="2" r="92" c="47"/>
   <application name="4" r="93" c="48"/>
 </query>

我知道怎么读这种xml文件

<Status>
    <code>200</code>
    <request>geocode</request>
</Status>

$status = (int) $xml-&gt;Status-&gt;code;

上面的xml中有application等重复的标签,有的怎么读?

【问题讨论】:

  • 旁注:你不是写过$url的值吗?不应该是$result= $url.urlencode($_REQUEST['site']);之类的吗?
  • 是的,对不起,这是一个错误
  • (sidenote) 基于 libxml 的扩展(如 SimpleXml)可以与自定义流上下文一起使用,因此技术上不需要使用 CURL

标签: php xml curl xmlhttprequest


【解决方案1】:

除了其他答案,您还可以使用 XPath 从 XML 结构中获取某些元素:

$xml-&gt;xpath('/query/application[@name=2]')

将返回具有name = 2 属性的&lt;application&gt; 元素。有关条件的更多信息,请参阅w3schools XPath tutorial。请记住,使用 SimpleXML 在 PHP 中 XPath 有点慢,即使您不会注意到它,除非您有一个包含数千个元素的大型文档。这是寻找不太大的 XMl 结构的好方法。如果您必须处理大型集合,您可能需要切换到 DOMDocument。它不是那么简单易懂,但使用 XPath 具有更好的性能。

更新

我看到您正在尝试将完整响应解析为 XMl。但是 $resp 实际上会包含完整的响应,我的意思是包括标题。当然它不会正确解析。你需要做的是:

//...
$resp = curl_exec($process);
$resp = substr( $resp, curl_getinfo($process, CURLINFO_HEADER_SIZE) );
curl_close($process); 
//...

【讨论】:

    【解决方案2】:
    $xml->application[0];
    
    $xml->application[1];
    
    $xml->application[2];
    
    ...
    

    【讨论】:

    • 我认为根元素不是作为单独的对象访问的,因此您可以直接检索根的子元素,例如 $xml->application[0],$xml->application[1 ] 等和 $xml['target'] 来访问根属性。
    • @user570783,这个例子你是对的。谢谢你。我将编辑我的答案。但是如果有两个或多个 ,他仍然必须将此元素用作对象:)
    • 但是...不能有多个根,这样就不是格式良好的 xml。
    • 不,不,因为我的英语不好,你误解了我:)。正如我所说,你是对的。
    【解决方案3】:

    application 项目将作为数组访问,例如:$xml-&gt;application[3]

    $x = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?>
     <query target="example.com">
       <application name="0" r="89" c="44"/>
       <application name="1" r="89" c="46"/>
       <application name="2" r="92" c="47"/>
       <application name="4" r="93" c="48"/>
     </query>');
    
     print_r($x); // View entire XML structure
    
     print_r($x->application[1]); // View the 2nd application item
    
     echo $x->application[1]['c']; // Get 'c' attribute from 2nd item (46)
    

    【讨论】:

    • 或者你可以使用SimpleXMLElement类的attribute()函数来获取属性。
    • 这里我得到一个错误 $xml = new SimpleXMLElement($resp);字符串无法解析为 XML。我应该如何将 $resp 转换为 Xml
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多