使用包含连字符和字符串的属性的xpath检索XML值

时间:2017-04-26 00:59:45

标签: php xml xpath

我正在尝试阅读七天预测,其中包含多达七个名为<forecast-period>的元素。每个<forecast-period>都有三个名为<text>且带有type属性的元素,我想检索包含句子的<text>元素。 XML文件位于ftp://ftp.bom.gov.au/anon/gen/fwo/IDV10705.xml

基本的XPath最终成为....

product/forecast/area[1]/forecast-period[@start-time-local="2018-04-24"]/text[@type="forecast"]

我想有一个PHP函数来解析日期并返回该元素的文本内容,但是我正在努力解析变量$strDate和属性中的连字符。

<?php 
$xml = file_get_contents('ftp://ftp.bom.gov.au/anon/gen/fwo/IDV10705.xml');
$strDate = '2017-04-30T05:00:00+10:00';
echo getPrecisForDate($xml,$strDate); 

function getPrecisForDate($xml,$strDate) {
  $precis = @$xml->forecast->area[1]->{'forecast-period'}[@start-time-local=$strDate]->text[@type="forecast"];
  return $precis;
}

请您协助我的语法检索文本内容,而不使用循环并将变量用作日期。

1 个答案:

答案 0 :(得分:1)

你将一个字符串传递给你的函数然后以某种方式期望能够将它视为某种神奇的对象/数组/东西。这不行。第一步是load the XML into a parser。然后,您需要在文档上运行XPath query以找到所需的元素。

您使用的XPath查询无效,因为start-time-local属性是完整的日期/时间字符串,而您只是在寻找日期。我将其更改为使用starts-with() function代替。

<?php
$url = "ftp://ftp.bom.gov.au/anon/gen/fwo/IDV10705.xml";
$date = "2017-04-27";
$xml = file_get_contents($url);
$dom = new DomDocument();
$dom->loadXML($xml);
$xpath = new DomXPath($dom);
$xpq = "/product/forecast/area[2]/forecast-period[starts-with(@start-time-local, '$date')]/text[@type='forecast']";
$nodes = $xpath->query($xpq);
echo $nodes[0]->textContent;

输出:

Partly cloudy. Slight (30%) chance of a shower in the late morning and afternoon. Winds south to southwesterly 20 to 25 km/h turning westerly 15 to 20 km/h in the evening.

您链接到的XML在area[1]中没有此类文本元素,因此我使用了area[2]。如果您正在寻找某个特定区域,则应通过检查area[@aac='whatever']而不是依靠位置来实现。