在xml上使用xpath接收此错误:在非对象上调用成员函数getAttribute()

时间:2012-12-11 22:00:29

标签: php xml xpath xml-parsing

我正在使用xpath查询我的xml“名称为”FT“的结果项,但我知道某些结果项没有,因为它是一个实时源。我是否可以分配这些'非对象'一个值,所以我可以将它们输入我的mysql以及返回的值?

以下是我的xml部分结果项:

 <live>
    <Match ct="0" id="771597" LastPeriod="2 HF" LeagueCode="19984" LeagueSort="1"              LeagueType="LEAGUE" startTime="15:00" status="2 HF" statustype="live" type="2" visible="1">

        <Home id="11676" name="Manchester City" standing="1"/>
    <Away id="10826" name="Newcastle United" standing="3"/>

        <Results>
        <Result id="1" name="CURRENT" value="1-1"/>
            <Result id="2" name="FT" value="1-1"/>
            <Result id="3" name="HT" value="1-0"/>
        </Results>
    </Match>

    <Match ct="0" id="771599" LastPeriod="1 HF" LeagueCode="19984" LeagueSort="1" LeagueType="LEAGUE" startTime="16:00" status="2 HF" statustype="live" type="2" visible="1">

        <Home id="11678" name="Norwich City" standing="1"/>
    <Away id="10828" name="West Ham United" standing="3"/>

    <Results>
            <Result id="1" name="Current" value="2-3"/>
            <Result id="2" name="HT" value="1-3"/>
        </Results>
    </Match>
    </live>

我正试图用这个名字'FT'得到所有得分:

$result = $xpath->query('./Results/Result[@name="FT"]', $match);
    $halftimescore = $result->item(0)->getAttribute("value");

我也改变了上述内容:

    $result = $xpath->query('./Results/Result[@name="FT"]', $match);

      if($result->length > 0) {
      $halftimescore = $result->item(0)->getAttribute("value");
}

删除错误,但我得到FT值1-1,3-0,对于非对象,它重复3-0

1 个答案:

答案 0 :(得分:2)

您的xpath查询似乎是在$matches

的循环中进行的

如果当前<Match>没有FT结果,如果你没有在循环开始时初始化它的值,那么$halftimescore保持前一个值是正常的。

您需要为每个$halftimescore

初始化<Match>
$halftimescore = null;
$result = $xpath->query('./Results/Result[@name="FT"]', $match);
if($result->length > 0) {
  $halftimescore = $result->item(0)->getAttribute("value");
}

或者使用else语句:

$result = $xpath->query('./Results/Result[@name="FT"]', $match);
if($result->length > 0) {
  $halftimescore = $result->item(0)->getAttribute("value");
} else {
  $halftimescore = null;
}

顺便说一句,因为匹配只能有一个FT分数,我会使用$result->length === 1来测试xpath结果。