На прошлой неделе я задал вопрос о создании скрипта для поиска XML-информации о событиях.
Использование нескольких запросов Xpath для поиска XML
Вопрос был закрыт предложением, что я вернусь, как только напишу какой-то код.
Я сделал это сейчас, поэтому я хотел опубликовать то, что я сделал, и спросить, правильно ли я подошел к этому.
Вот параметры, которые я хочу найти:
id – возвращает информацию для конкретного события с соответствующим атрибутом id.
q – общий поисковый запрос, который будет возвращать соответствия в любом месте примечания к событию
ключевые слова, место проведения, билет, время начала – поиск совпадений в этих конкретных элементах
program_list, performer_list – искать совпадения в любых дочерних элементах этих элементов (в каждом случае есть несколько исполнителей)
dateFrom, dateTo – разрешить поиск по диапазону дат.
Вот пример события:
<event id="69399"> <starttimeunixtime>1349791200</starttimeunixtime> <endtimeunixtime>1350507600</endtimeunixtime> <starttime>2012-10-09 15:00:00</starttime> <endtime>2012-10-17 22:00:00</endtime> <formatted_startdate>09 October 2012</formatted_startdate> <formatted_enddate>17 October 2012</formatted_enddate> <formatted_starttime>3:00pm</formatted_starttime> <formatted_endtime>10:00pm</formatted_endtime> <venue>Royal Albert Hall</venue> <title>A concert of Music</title> <performer_list> <performer_7> <performer>AN Other</performer> <instrument>Viola</instrument> </performer_7> </performer_list> <program_list> <program_8> <program>Beethoven</program> <program_work>Symphony No. 2</program_work> </program_8> </program_list> <description><![CDATA[<p>This is the description This is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the descriptionThis is the description</p>]]></description> <shortDescription><![CDATA[<p>This is the short description This is the short description This is the short description This is the short description This is the short description This is the short description This is the short description This is the short description </p>]]></shortDescription> <eventType>Highlights</eventType> <keywords>orchestra</keywords> <ticketInfo><![CDATA[<p>This is the ticket info </p>]]></ticketInfo> <ticketed>YES</ticketed> </event>
И вот мой сценарий:
<? //Load events XML $events=simplexml_load_file('events.xml'); //If single event find that info if(isset($_GET['id'])): $id=preg_replace("/[^0-9]/","",$_GET['id']); $query='@id="'.$id.'"'; $outputtype="singleevent"; //Allow for a general search that will search all fields elseif(isset($_GET['q'])): $searchterm=strtolower(preg_replace("/[^A-Za-z0-9\s:-]/","",$_GET['q'])); $query.='contains(translate(.,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"), "'.$searchterm.'") and '; echo $query; $query= substr_replace($query, "", -5); //Otherwise build a query to do the search. elseif (!empty($_GET)): foreach($_GET as $key => $value): //Remove unwanted characters from userinput $searchterm=strtolower(preg_replace("/[^A-Za-z0-9\s:-]/","",$value)); //Do a simple search //Xpath doesn't support case insensitive searching, so I'm using the Xpath translate function, which swaps uppercase letters for their lowercase counterpart. if($key=='keywords' || $key=='venue' || $key=='ticketed' || $key=='starttime'): $query.='contains(translate('.$key.',"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"), "'.$searchterm.'") and '; endif; // Do a search of composite fields if($key=='program_list' || $key=='performer_list'): $query.='contains(translate('.$key.'/*,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"), "'.$searchterm.'") and '; endif; // Allow for a date range query (we might have dateFrom, dateTo or both!) if($key=='dateFrom'): $query.='endtimeunixtime > '.strtotime($searchterm. "00:00:00").' and '; endif; if($key=='dateTo'): $query.='starttimeunixtime < '.strtotime($searchterm." 23:59:59").' and '; endif; endforeach; // Remove final 'and' from query $query=substr_replace($query, "", -5); //End of Query Builder endif; // If there is no query, then show all events. if($query==""): $query='*'; endif; //Query XML $events=($events->xpath('event['.$query.']')); //Use $events to generate pages ?>
Кажется, он работает по мере необходимости, но мне было просто интересно, есть ли у кого-нибудь какие-либо отзывы / предложения альтернативных методов, поскольку мне в будущем понадобится много сделать с XML. Благодаря!