【问题标题】:Having trouble to extract data from xml无法从 xml 中提取数据
【发布时间】:2011-12-09 20:57:45
【问题描述】:

我正在尝试从 xml 中获取数据,但是遇到了问题。

我已经创建了简单的代码,但我认为它们进展不顺利..

<?php
    $cricapi = 'http://synd.cricbuzz.com/j2me/1.0/livematches.xml';

    function followers($url) {  
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        $data = curl_exec($ch);
        curl_close($ch);

        $xml = new SimpleXMLElement($data);
        $mthType = $xml->match['type'];
        if ( $mthType == "ODI") 
        {
            $match = $xml->match['mchDesc'];
            return $match;
        }

    }
?>

并调用为

<?php echo $match = followers($cricapi); ?>

但我无法获取结果。

请帮我解决这个问题。我正在尝试制作类似http://www.hamariweb.com/

请帮我解决这个问题..谢谢大家

【问题讨论】:

  • 确切的问题是什么? “但我无法获取结果”不是一个具体问题。
  • 请尝试运行此脚本。如果 type == ODI 则应用条件然后提取匹配描述,但脚本仅检查第一种类型并且不再运行 .. 即使我尝试过foreach 循环 :(
  • 您是否尝试使用 data_is_url 标志而不是 curl?尝试$xml = new SimpleXMLElement($url,0,true); 仅用于检索 xml。

标签: php xml api xml-parsing


【解决方案1】:

你的问题是因为 match 是一个匹配数组,你不能使用 $match['type'] 但必须像这样迭代匹配:

function followers($url) {  
  $xml = new SimpleXMLElement($url,1,true);
  foreach($xml->match AS $match){
    if($match['type']== "ODI"){
      echo $match['mchDesc'];
    }
  }
}

你也不需要卷曲。如果没有原因,您始终可以使用 data_is_url,然后给 SimpleXMLElement url!

【讨论】:

    【解决方案2】:

    你为此使用了错误的方法,一般来说:-

    $found = $xml->xpath("//match[@type='ODI']");
    // is an array of collection that with node name is match, and attribute type=ODI
    

    当有重复的节点名(匹配)时,
    它将呈现为对象列表(数组),
    你不能只使用$xml-&gt;match,
    但是$xml-&gt;match[0], $xml-&gt;match[1] ...

    属性可以用attributes()

    无论如何,长话短说,使用xpath 是更简单的解决方案

    【讨论】:

    • 我不太清楚..你能描述一下吗
    【解决方案3】:

    问题似乎出在这里:

    $mthType[] = $xml->match['type'];
    if ( $mthType == "ODI") {
        ...
    }
    

    第一句话会给你一组符合你条件的元素。 您不能只应用比较,就好像它是一个简单的变量。您应该迭代返回的元素。或者您应该应用过滤器来获取那些属性“类型”为“ODI”的“匹配”元素。

    【讨论】:

      【解决方案4】:

      问题不在于您的 XML 解析,而在于您的 $mthType 检查,特别是这两行:

      $mthType[] = $xml->match['type'];
      if ( $mthType == "ODI")
      

      您将 $mthType 设置为数组,然后仅在匹配字符串时才返回它,这永远不会发生。从第一个作业中删除空的数组创建括号,这应该会让你走上正确的轨道。

      $mthType = $xml->match['type'];
      if ( $mthType == "ODI")
      

      【讨论】:

      • 对不起,我打错了,但我也尝试过这种方式..但同样的反应:(
      • 在处理 SimpleXML 的结果时,有时必须显式地给出(字符串)数据类型。试试这一行: $mthType = (string)$xml->match['type'];或者,按照另一个答案中的建议使用 xpath,这是首选。
      猜你喜欢
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 2021-03-18
      相关资源
      最近更新 更多