检查XML元素是否存在于循环中

时间:2015-04-30 10:55:01

标签: php xml xpath

对于一个网站,我需要从外部XML文件中获取数据。 我加载这样的数据:

$doc = new DOMDocument();
$url = 'http://myurl/results/xml/12345';

if (!$doc->load($url)) 
{
    echo json_encode(array('error'=> 'error')); 
    exit;
}

$xpath = new DOMXPath($doc);
$program_date = $xpath->query('//game/date');

然后我使用foreach循环来获取所有数据

if($program_date){
    foreach($program_date as $node){
        $programArray['program_date'][]  = $node->nodeValue;
    }
}

我遇到的问题是有时候某个游戏没有约会。 因此,当游戏没有约会时,我只想让它放置" - ",而不是XML文件中的日期。我的问题是,我不知道如何检查数据中是否存在日期。

我使用了很多方法,比如isset,!isset,else,!empty,empty

$teamArray['program_kind'][]  = "-";

但注意到...... 有人可以帮我解决这个问题吗? 提前致谢

1 个答案:

答案 0 :(得分:1)

您需要迭代game元素,将它们用作上下文并使用其他XPath表达式获取数据。

但首先要做的一件事。使用DOMXPath::evaluate()DOMXPath::query()仅支持位置路径。它只能返回一个节点列表。但XPath表达式也可以返回标量值。

$xpath = new DOMXPath($doc);
$games = $xpath->evaluate('//game');

//game的结果始终是DOMNodeList个对象。它可以是一个空列表,但您可以直接迭代它。像if ($games)这样的条件永远都是真的。

foreach ($games as $game) {

现在您拥有game元素节点,您可以将其用作上下文来获取其他数据。

  $date = $xpath->evaluate('string(date)', $game);

string()将位置路径的第一个节点强制转换为字符串。如果它不匹配节点,它将返回一个空字符串。如果要同时删除空格,请选中normalize-space()

您可以使用game验证date元素是否包含count()节点。

  $hasDate = $xpath->evaluate('count(date) > 0', $game);

此XPath表达式的结果始终是布尔值。