创建XPath搜索应用程序

时间:2012-10-09 16:47:01

标签: php xml xpath

上周我问了一个关于创建脚本来搜索事件信息的XML提要的问题。

Using multiple Xpath queries to search 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>A.N. 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&nbsp;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&nbsp;This is the short description&nbsp;This is the short description&nbsp;This is the short description&nbsp;This is the short description&nbsp;This is the short description&nbsp;This is the short description&nbsp;This is the short description&nbsp;</p>]]></shortDescription>
    <eventType>Highlights</eventType>
    <keywords>orchestra</keywords>
    <ticketInfo><![CDATA[<p>This is the ticket info&nbsp;</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做很多事情。谢谢!

0 个答案:

没有答案