2013-10-13 2 views
1

Критическая функция в скрипте PHP. Я отлаживаю два атрибута get из XML-файла на внешнем сайте. Атрибуты помечены как «code» и «locationCode» в теге Channel. Проблема в том, что иногда locationCode отправляется как пустая строка ('') или вообще не определен сайтом для каналов, которые я не могу использовать, поэтому мне нужно прокручивать каналы до тех пор, пока не найду строку непустого locationCode. Для этого я создал цикл while, но моя текущая реализация не прошла успешно через коды местоположения. Есть ли лучший способ реализовать это?Проверка пустых атрибутов при анализе XML-файла

Текущий код:

public function setChannelAndLocation(){ 
    $channelUrl="http://service.iris.edu/fdsnws/station/1/query?net=".$this->nearestNetworkCode. 
    "&sta=".$this->nearestStationCode."&starttime=2013-06-07T01:00:00&endtime=".$this->impulseDate. 
    "&level=channel&format=xml&nodata=404"; 
    $channelXml= file_get_contents($channelUrl); 
    $channel_table = new SimpleXMLElement($channelXml); 

    $this->channelUrlTest=$channelUrl; 
    //FIXME: Check for empty locationCode string 
    $this->channelCode = $channel_table->Network->Station->Channel[0]['code']; 
    $this->locationCode = $channel_table->Network->Station->Channel[0]['locationCode']; 
    $i = 1; 
    while($this->locationCode=''){ 
    $this->channelCode = $channel_table->Network->Station->Channel[$i]['code']; 
    $this->locationCode = $channel_table->Network->Station->Channel[$i]['locationCode']; 
    $i++; 
    } 
} 

пример XML-файл для кода: http://service.iris.edu/fdsnws/station/1/query?net=PS&sta=BAG&starttime=2013-06-07T01:00:00&endtime=2013-10-12T18:47:09.5000&level=channel&format=xml&nodata=404

+1

[ '$ locationCode = $ channel_table-> xpath ('// Channel/@ locationCode [.! = ""]'); '] (http://php.net/manual/en/simplexmlelement.xpath.php) – Wrikken

+0

Или, тамподы там, поэтому ['$ channel_table-> -> registerXPathNamespace ('default', 'http: //www.fdsn.org/xml/station/1'); $ locationCode = $ channel_table-> xpath ('// default: Channel/@ locationCode [.! = ""] '); '] (http://php.net/manual/en/simplexmlelement.xpath.php) – Wrikken

ответ

1

Есть две проблемы, я могу видеть с этой линией:

while($this->locationCode=''){ 

Во-первых, вы набрали задание (=), когда вы хотели сравнить (==). Поэтому вместо проверки условия эта строка переписывает текущее значение $this->locationCode, а затем тестирует «правдоподобие» '', который вычисляется до false, поэтому цикл while никогда не запускается.

Во-вторых, пример XML-файла показывает, что атрибут на самом деле пуст, но содержит некоторые пробелы. Предполагая, что эти значения, которые вы хотите игнорировать (их нет в образце прямо сейчас, которые имеют любое другое значение), вы можете использовать trim() для устранения пробелов из сравнения, давая вам это:

while(trim($this->locationCode) == '') { 
Смежные вопросы