2011-04-23 68 views
1

我有这样的XML:PHP - SimpleXML的

<events> 
    <event> 
     <eventId>Bskt-Bulls-Pacer-042111</eventId> 
     <eventDescriptor></eventDescriptor> 
     <eventStatus></eventStatus> 
     <markets> 
     <market> 
      <lineType>PSH</lineType> 
      <status>1</status> 
      <num>100</num> 
      <den>110</den> 
      <points>4.0</points> 
      <quickbet></quickbet> 
      <price>-110</price> 
      <openNum>100</openNum> 
      <openDen>110</openDen> 
      <openPoints>-5.0</openPoints> 
      <openPrice>-110</openPrice> 
      <percentage>23%</percentage> 
     </market> 
     <market></market> 
     <market></market> 
     <market> 
      <lineType>PSA</lineType> 
      <status>1</status> 
      <num>100</num> 
      <den>110</den> 
      <points>-4.0</points> 
      <quickbet> 
       selection[Bskt-Bulls-Pacer-042111PSA]=Bskt-Bulls-Pacer-042111|PSA|1|100|110|-8|-110 
      </quickbet> 
      <price>-110</price> 
      <openNum>100</openNum> 
      <openDen>110</openDen> 
      <openPoints>5.0</openPoints> 
      <openPrice>-110</openPrice> 
      <percentage>77%</percentage> 
     </market> 
     <market></market> 
     <market></market> 
     </markets> 
     <hosturl></hosturl> 
    </event> 
    <event></event> 
    <event></event> 
    <event></event> 
    <event></event> 
    <event></event> 
    <event></event> 
    <event></event> 
</events> 

我坚持试图从市场撤出只有<points>当线型= PSA和TLO。我需要从多个<event>节点中获取此信息。我如何测试每个<event>中的<market>的lineType并提取我想要的?

这是我有什么,但显然是行不通的:

foreach ($xml->event as $event) { 

foreach ($xml->event->markets->market as $market) { 

    if ($market->lineType == 'TLO') { 

     echo "points are TLO = " . $market->points;     

    } 

    if ($market->lineType == 'PSH') { 

     echo "points are PSA = " . $market->points; 


    } 

    } 
} 

回答

1

你可以使用DOM文档的方法如上图所示。

我认为你的代码中的错误是你假设事件是内部循环中的单个节点。 由于在XML中所示,事件标记出现多次,所以你需要在内部循环使用$事件: -

foreach ($xml->event as $event) { 

foreach ($event->markets->market as $market) { 

    if ($market->lineType == 'TLO') { 
     echo "points are TLO = " . $market->points; 
    } 

    if ($market->lineType == 'PSH') { 
     echo "points are PSA = " . $market->points; 
    } 

} 
} 
+0

这解决了它与一个单词的变化。谢谢!只是无法弄清楚如何在事件内部正确循环,并且它已经钉牢了。 – midnight24 2011-04-23 22:59:05

+0

你介意为答案投票吗?谢谢。 – Ajoy 2011-04-24 03:51:47

0

我个人一直使用DOM文档,这将是:

$xml = new DOMDocument(); 
$xml->loadXML($varholdingxml); // or $xml->loadXMLFile("/path/to/xmlfile.xml"); 
foreach ($xml->getElementsByTagName("event") as $parent) 
{ 
$lineType = $parent->getElementsByTagName("lineType")->item(0)->nodeValue; 
if ($lineType == "PSH" || $lineType == "TLO") 
{ 
    $points = $parent->getElementsByTagName('points')->item(0)->nodeValue; 
    echo "Points are " . $lineType . " = " . $points; 
} 
} 
+0

谢谢,这是非常有益的,这是我从来没有考虑。再次感谢! – midnight24 2011-04-23 22:58:03