简体   繁体   中英

Filter XML data (with a namespace) using XPath in PHP

hoping you can help out a PHP newbie (show me C# and I'm fine.).

I want to filter XML data based on a PHP variable. Here's a cut of my XML file:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0" xmlns:job="https://my/namespace/URL.dtd">
<channel>
<title>search form results</title>
<link></link>
<description></description>
<item>
    <title>TEST - Funeral Administrator</title>
    <link> https://itrent-web1.midlandsco-op.com/tlive_webrecruitment/wrd/run//ETREC107GF.open?VACANCY_ID%3d3416494H67&amp;WVID=6405682s15</link>
    <guid> https://itrent-web1.midlandsco-op.com/tlive_webrecruitment/wrd/run//ETREC107GF.open?VACANCY_ID%3d3416494H67&amp;WVID=6405682s15</guid>
    <description><![CDATA[<b>Reference:</b> REQ000072<br /><b>Description:</b> Applications are invited for a part time, 22.5 hours per week, Funeral Administratorwhich will be based at West Bromwich Funeral Home within the West Region. Working as part of a team, duties will include co-ordinating funeral arrangements according to the clients' wishes, compiling the required administration, offering advice on the full range of services available and liaising with all relevant authorities and internal contacts. You will also be expected to assist families who wish to pay their last respects.You will be required to administer petty cash, cheque reconciliation forms, banking and purchase ledger. Other general office duties include answering the telephones, basic computer input and filing will also be key duties of this role.Applicants will have good inter-personal skills, driving licence and must also have good keyboard skills and computer literate. A flexible approach to working hours is also required.<br /><b>Region:</b> Birmingham<br /><b>Location:</b> West Bromwich<br /><b>Salary:</b> from £7.31 per hour<br /><b>Package:</b> n/a ]]></description>
    <job:description>Applications&#x20;are&#x20;invited&#x20;for&#x20;a&#x20;part&#x20;time&#x2c;&#x20;22.5&#x20;hours&#x20;per&#x20;week&#x2c;&#x20;Funeral&#x20;Administratorwhich&#x20;will&#x20;be&#x20;based&#x20;at&#x20;West&#x20;Bromwich&#x20;Funeral&#x20;Home&#x20;within&#x20;the&#x20;West&#x20;Region.&#x20;Working&#x20;as&#x20;part&#x20;of&#x20;a&#x20;team&#x2c;&#x20;duties&#x20;will&#x20;include&#x20;co-ordinating&#x20;funeral&#x20;arrangements&#x20;according&#x20;to&#x20;the&#x20;clients&#x27;&#x20;wishes&#x2c;&#x20;compiling&#x20;the&#x20;required&#x20;administration&#x2c;&#x20;offering&#x20;advice&#x20;on&#x20;the&#x20;full&#x20;range&#x20;of&#x20;services&#x20;available&#x20;and&#x20;liaising&#x20;with&#x20;all&#x20;relevant&#x20;authorities&#x20;and&#x20;internal&#x20;contacts.&#x20;You&#x20;will&#x20;also&#x20;be&#x20;expected&#x20;to&#x20;assist&#x20;families&#x20;who&#x20;wish&#x20;to&#x20;pay&#x20;their&#x20;last&#x20;respects.You&#x20;will&#x20;be&#x20;required&#x20;to&#x20;administer&#x20;petty&#x20;cash&#x2c;&#x20;cheque&#x20;reconciliation&#x20;forms&#x2c;&#x20;banking&#x20;and&#x20;purchase&#x20;ledger.&#x20;Other&#x20;general&#x20;office&#x20;duties&#x20;include&#x20;answering&#x20;the&#x20;telephones&#x2c;&#x20;basic&#x20;computer&#x20;input&#x20;and&#x20;filing&#x20;will&#x20;also&#x20;be&#x20;key&#x20;duties&#x20;of&#x20;this&#x20;role.Applicants&#x20;will&#x20;have&#x20;good&#x20;inter-personal&#x20;skills&#x2c;&#x20;driving&#x20;licence&#x20;and&#x20;must&#x20;also&#x20;have&#x20;good&#x20;keyboard&#x20;skills&#x20;and&#x20;computer&#x20;literate.&#x20;A&#x20;flexible&#x20;approach&#x20;to&#x20;working&#x20;hours&#x20;is&#x20;also&#x20;required.</job:description>
    <job:reference>REQ000072</job:reference>
    <job:salary>from&#x20;&#xa3;7.31&#x20;per&#x20;hour</job:salary>
    <job:salaryval>14800</job:salaryval>
    <job:minsalary>14000</job:minsalary>
    <job:maxsalary>16000</job:maxsalary>
    <job:category>Funeral</job:category>
    <about>Mon, 8 Aug 2011 00:00:00 GMT</about>
    <job:region>Birmingham</job:region>
    <job:location>West&#x20;Bromwich</job:location>
    <job:package>n&#x2f;a</job:package>
    <pubDate>Mon, 25 Jul 2011 00:00:00 GMT</pubDate>
</item>
... etc - other <item> nodes follow

I get 2 PHP variables from

$category = $_POST['category'];
$region = $_POST['region'];

I want to be able to filter my XML based on these variables but can't figure out how to do it. Note that the region and category nodes in my XML are preceded with a namespace.

Here's my (very basic so don't laugh) PHP

<?php 
$xml = simplexml_load_file("jobs-rss.xml");
if(isset($_POST['category']) && isset($_POST['region'])) 
{
$category = $_POST['category'];
$region = $_POST['region'];
$html = '';

if($category == "All" && $region == "All")
{        
    // Load all jobs
    foreach($xml->channel->item as $item){
    $ns = $item->children('https://itrent-web1.midlandsco-op.com/tlive_webrecruitment/wrd/run/../../webrecRSS.dtd');

    $html .= "<h2>" . $item->title . "</h2>";
    $html .= "<p><strong>Reference: </strong>" . $ns->reference . "</p>";
    $html .= "<p>" . $ns->description . "</p>";
    $html .= "<p><strong>Salary: </strong>" . $ns->salary . "</p>";
    $html .= "<p><strong>Region: </strong>" . $ns->region . "</p>";
    $html .= "<p><strong>Location: </strong>" . $ns->location . "</p>";
    $html .= "<p><strong>Category: </strong>" . $ns->category . "</p>";
    $html .= "<p><strong>Closing Date: </strong>" . $ns->closingdate . "</p>";
    $html .= "<p><a href='" . $item->link . "'>Click here to apply for this job</a></p>";
    }
}
else 
{
    // Filter my XML here based on a combination of the $category and $region varaibles
}       
}

echo $html;

?>

Any help would be greatly appreciated.

Thanks, Brett

By filtering, did you mean this?

<?php 

$xml = simplexml_load_file("jobs-rss.xml");

if(isset($_POST['category']) && isset($_POST['region'])) 
{
    $category = $_POST['category'];
    $region = $_POST['region'];
    $html = '';

    // Load all jobs
    foreach($xml->channel->item as $item)
    {
        $ns = $item->children('https://itrent-web1.midlandsco-op.com/tlive_webrecruitment/wrd/run/../../webrecRSS.dtd');

        if ($category != "All" && $category != $ns->category) continue;
        if ($region != "All" && $region != $ns->region) continue;

        $html .= "<h2>" . $item->title . "</h2>";
        $html .= "<p><strong>Reference: </strong>" . $ns->reference . "</p>";
        $html .= "<p>" . $ns->description . "</p>";
        $html .= "<p><strong>Salary: </strong>" . $ns->salary . "</p>";
        $html .= "<p><strong>Region: </strong>" . $ns->region . "</p>";
        $html .= "<p><strong>Location: </strong>" . $ns->location . "</p>";
        $html .= "<p><strong>Category: </strong>" . $ns->category . "</p>";
        $html .= "<p><strong>Closing Date: </strong>" . $ns->closingdate . "</p>";
        $html .= "<p><a href='" . $item->link . "'>Click here to apply for this job</a></p>";
    }    
}

echo $html;

?>

By the way, your namespace url " https://itrent-web1.midlandsco-op.com/tlive_webrecruitment/wrd/run/../../webrecRSS.dtd " looks a bit strange. I think it would be more clear if you remove the relative '..' stuff and make it like this: https://itrent-web1.midlandsco-op.com/tlive_webrecruitment/webrecRSS.dtd SimpleXML's child() method will only work with exactly the same URI that is provided in the RSS node's xmlns:job attribute.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM