XPath query does not return answer - php

I try to build a simple chatbot in HTML/PHP/XML. The 'brain' is build in XML. A html form will be submitted through AJAX which makes a call to searchBrain.php. The problem is, when is submit the form, searchBrain does not query my brain.xml file. Can someone offer me some help?
brain.xml
<?xml version="1.0" encoding="UTF-8"?>
<brain>
<neuron>
<id>1</id>
<input>wie ben jij?</input>
<code></code>
<output>Ik ben Skye</output>
<keywords>wie,ben,jij,Wie,?</keywords>
<image></image>
</neuron>
<neuron>
<id>2</id>
<input>hoe gaat het?</input>
<code></code>
<output>Met mij gaat het goed. Hoe gaat het me u?</output>
<keywords>hoe,gaat,het,Hoe,?</keywords>
<image></image>
</neuron>
<neuron>
<id>3</id>
<input>wat ben jij?</input>
<code></code>
<output>Ik ben het laatste resultaat in kunstmatige intelligentie die de functies van het menselijk brein kan reproduceren met een grotere snelheid en nauwkeurigheid.</output>
<keywords>wat,ben,jij,Wat,?</keywords>
<image></image>
</neuron>
<neuron>
<id>4</id>
<input>hoe zie jij er uit?</input>
<code></code>
<output></output>
<keywords>hoe,zie,jij,er,uit,Hoe,?</keywords>
<image><!-- insert binary.jpg from imgLib --></image>
</neuron>
<neuron>
<id>5</id>
<input>stel jezelf even voor</input>
<code></code>
<output>Hoi ik ben Skye, ik ben online gegaan op 17-02-2016.Ik ben het laatste resultaat in kunstmatige intelligentie die de functies van het menselijk brein kan reproduceren met een grotere snelheid en nauwkeurigheid.</output>
<keywords>stel,jezelf,even,voor</keywords>
<image></image>
</neuron>
<neuron>
<id>6</id>
<input>Welke dag is het vandaag?</input>
<code><!-- PHP code om huidige dag weer te geven --></code>
<output>Vandaag is het </output>
<keywords>welke,dag,is,het,vandaag,?</keywords>
<image></image>
</neuron>
<neuron>
<id>7</id>
<input>wanneer ben je jarig?</input>
<code></code>
<output>Ik ben online gegaan op 17 Februari, dus ik ben jarig op 17 Februari :-)</output>
<keywords>wanneer,ben,je,jarig,?</keywords>
<image><!-- jarig.jpeg from imgLib --></image>
</neuron>
</brain>
searchBrain.php
<?php
//Create DOMDocument based on XML
$dom = new DOMDocument();
// We don't want to bother with white spaces
$dom->preserveWhiteSpace = false;
//Load brain.xml
$dom->Load('brain.xml');
//Get POST value
$sentence = $_POST['sentence'];
//Lowercase the XML so non case sensitive search is possible
$xml = strtolower($xml);
//Create XPath based on the DOM Document to search it
$xpath = new DOMXpath($dom);
//Define keywords for search
$searchKeywords = array($sentence);
//Iterate all of them to make them into valid XPath
$searchKeywords = array_map(
function($keyword){
//Replace any single quotes with an escaped single quote
$keyword = str_replace('\'','\\\'',$keyword);
return 'contains(.,\''.$keyword.'\')';
},
$searchKeywords
);
//Implode all the keywords using and, could
//be changed to be an "or" condition if needed
$searchKeywords = implode(' and ',$searchKeywords);
//The search keywords now look like contains(.,'good') and
//contains(.,'hello')
//Search for any neuron tag that contains the text
//submitted by the from
$nodes = $xpath->query('//keywords['.$searchKeywords.']');
//Iterate all nodes
foreach($nodes as $node){
//Find the output node an print its content
var_dump($xpath->query('output',$node)->item[3]->textContent);
}
?>
And the index.php
<!DOCTYPE html>
<head>
<title>Skye</title>
<script src="jquery-2.1.4.js"></script>
<script>
$(document).ready(function() {
$("#Skye").submit(function(e){
var url = "searchBrain.php";
$.ajax({
type: "POST",
url: url,
data: $("#Skye").serialize(),
success: function(response){
$("#result").html(response);
//alert(response);
}
});
e.preventDefault();
});
});
</script>
<link rel="stylesheet" type="text/css" href="gui/css/skye.css" />
</head>
<body>
<h1>Skye</h1>
<div id="result"></div>
<form id="Skye" name="Skye" method="POST" >
<input type="text" id="sentence" name="sentence" autofocus="autofocus" />
<input type="submit" id="display" value="Stuur..." />
</form>
</body>
</html>

Well I found a problem with your query. If you are looking for exact matches and want the parent node you need this:
$nodes = $xpath->query('//neuron/keywords[contains(text(), "wanneer") and contains(text(), "gaat")]/..');
so you would replace implode(' and ', $searchKeywords) with the above.
You can also shorthand the above syntax like so as per a commentator below:
$nodes = $xpath->query('//neuron[keywords[contains(., "wanneer") or contains(., "gaat")]]');
What does it do?
Well it looks at every neuron then searches if the text value of <keywords> has what you're looking for and the /.. is like a filepath that basically returns the parent. Pretty nifty. Now you can get the <output> tag.
//Iterate all nodes
foreach($nodes as $node){
//Find the output node an print its content
var_dump($xpath->query('output',$node)->item(0)->textContent);
}
Here is my code in full that I tested with. You can copy paste this in a test file to see the results and tinker so that you can adopt it to your script.
<?php
$xml = xml_str();
$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath= new DOMXPath($dom);
$nodes = $xpath->query('//neuron/keywords[contains(text(), "wanneer") or contains(text(), "gaat")]/..');
foreach ($nodes as $node) {
var_dump($xpath->query('output', $node)->item(0)->textContent);
}
function xml_str()
{
return <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<brain>
<neuron>
<id>1</id>
<input>wie ben jij?</input>
<code></code>
<output>Ik ben Skye</output>
<keywords>wie,ben,jij,Wie,?</keywords>
<image></image>
</neuron>
<neuron>
<id>2</id>
<input>hoe gaat het?</input>
<code></code>
<output>Met mij gaat het goed. Hoe gaat het me u?</output>
<keywords>hoe,gaat,het,Hoe,?</keywords>
<image></image>
</neuron>
<neuron>
<id>3</id>
<input>wat ben jij?</input>
<code></code>
<output>Ik ben het laatste resultaat in kunstmatige intelligentie die de functies van het menselijk brein kan reproduceren met een grotere snelheid en nauwkeurigheid.</output>
<keywords>wat,ben,jij,Wat,?</keywords>
<image></image>
</neuron>
<neuron>
<id>4</id>
<input>hoe zie jij er uit?</input>
<code></code>
<output></output>
<keywords>hoe,zie,jij,er,uit,Hoe,?</keywords>
<image><!-- insert binary.jpg from imgLib --></image>
</neuron>
<neuron>
<id>5</id>
<input>stel jezelf even voor</input>
<code></code>
<output>Hoi ik ben Skye, ik ben online gegaan op 17-02-2016.Ik ben het laatste resultaat in kunstmatige intelligentie die de functies van het menselijk brein kan reproduceren met een grotere snelheid en nauwkeurigheid.</output>
<keywords>stel,jezelf,even,voor</keywords>
<image></image>
</neuron>
<neuron>
<id>6</id>
<input>Welke dag is het vandaag?</input>
<code><!-- PHP code om huidige dag weer te geven --></code>
<output>Vandaag is het </output>
<keywords>welke,dag,is,het,vandaag,?</keywords>
<image></image>
</neuron>
<neuron>
<id>7</id>
<input>wanneer ben je jarig?</input>
<code></code>
<output>Ik ben online gegaan op 17 Februari, dus ik ben jarig op 17 Februari :-)</output>
<keywords>wanneer,ben,je,jarig,?</keywords>
<image><!-- jarig.jpeg from imgLib --></image>
</neuron>
</brain>
XML;
}
?>

Related

Filtering more categories out of XML item

I would like to only get the news that has the child <category>Lifestyle</category> in it. But my code currently only gets the first category and I would like to have the code to search for all <category> in one <item> I have written this code in PHP so far:
<?php
$html = "";
$url = "http://www.nu.nl/rss";
$xml = simplexml_load_file($url);
for($i = 0; $i < 10; $i++){
$title = $xml->channel->item[$i]->title;
$link = $xml->channel->item[$i]->link;
$description = $xml->channel->item[$i]->description;
$pubDate = $xml->channel->item[$i]->pubDate;
$category = $xml->channel->item[$i]->category;
if(strpos($category, 'Binnenland')!==false) {
$html .= "<a href='$link'><h3>$title</h3></a>";
$html .= "$description";
$html .= "<br />$pubDate & $category<hr />";
}
}
echo $html;
?>
Some <item> have more categories but it should be in my filtered news as well if it contains <category >Lifestyle</category> (but my code currently only finds the first one)
Part of the XML:
<item>
<title>Elsevier lijft Newsflo in</title>
<link>http://www.nu.nl/beurs/3970862/elsevier-lijft-newsflo-in.html</link>
<description>Elsevier neemt het Britse Newsflo over. Dat maakt het bedrijf maandag bekend.</description>
<pubDate>Mon, 12 Jan 2015 11:43:41 +0100</pubDate>
<guid isPermaLink="false">3970862</guid>
<enclosure url="http://media.nu.nl/m/m1mxod5a5wxc_sqr256.jpg/elsevier-lijft-newsflo-in.jpg" length="0" type="image/jpeg" />
<category>Beurs</category>
<dc:creator>ANP</dc:creator>
<dc:rights>copyright photo: ANP</dc:rights>
<atom:link href="http://nu.nl/beurs/3800685/elsevier-koopt-medische-informatieleverancier.html" type="text/html" rel="related" title="Elsevier koopt medische informatieleverancier" />
</item>
<item>
<title>'Frida Giannini krijgt geen afscheidsshow bij Gucci'</title>
<link>http://www.nu.nl/lifestyle/3970858/frida-giannini-krijgt-geen-afscheidsshow-bij-gucci.html</link>
<description>Frida Giannini, voormalig hoofdontwerpster van Gucci, heeft geen grote afscheidsshow gekregen zoals verwacht. De ontwerpster zou vrijdag stilletjes vertrokken zijn bij het label.</description>
<pubDate>Mon, 12 Jan 2015 11:41:52 +0100</pubDate>
<guid isPermaLink="false">3970858</guid>
<enclosure url="http://media.nu.nl/m/m1mxn43acqev_sqr256.jpg/frida-giannini-krijgt-geen-afscheidsshow-bij-gucci.jpg" length="0" type="image/jpeg" />
<category>Lifestyle</category>
<dc:creator>NU.nl</dc:creator>
<dc:rights>copyright photo: Wenn</dc:rights>
<atom:link href="http://nu.nl/lifestyle/3970265/alessandro-michele-nieuwe-hoofdontwerper-gucci.html" type="text/html" rel="related" title="'Alessandro Michele nieuwe hoofdontwerper Gucci'" />
<atom:link href="http://nu.nl/lifestyle/3951514/hoofdontwerpster-en-directeur-vertrekken-bij-gucci.html" type="text/html" rel="related" title="Hoofdontwerpster en directeur vertrekken bij Gucci" />
<atom:link href="http://nu.nl/lifestyle/3783917/hoofdontwerpster-gucci-spreekt-geruchten-vertrek.html" type="text/html" rel="related" title="Hoofdontwerpster Gucci spreekt geruchten vertrek tegen" />
</item>
<item>
<title>Militairen met buitenlandse partner naar rechter</title>
<link>http://www.nu.nl/binnenland/3970856/militairen-met-buitenlandse-partner-rechter.html</link>
<description>Een aantal militairen met een buitenlandse partner stapt naar de rechter omdat zij al maanden geschorst thuis zitten. De schorsing is het gevolg van het feit dat hun partner niet gescreend kan worden.</description>
<pubDate>Mon, 12 Jan 2015 11:41:24 +0100</pubDate>
<guid isPermaLink="false">3970856</guid>
<enclosure url="http://media.nu.nl/m/m1oxcv7anu4p_sqr256.jpg/militairen-met-buitenlandse-partner-rechter.jpg" length="0" type="image/jpeg" />
<category>Binnenland</category>
<category>Lifestyle</category>
<dc:creator>ANP</dc:creator>
<dc:rights>copyright photo: ANP</dc:rights>
</item>
I think I made a mistake in the PHP but I do not know how to work around it...
Select only desired <item>s with xpath():
$xml = simplexml_load_string($x); // assume XML in $x
$items = $xml->xpath("//item[category='Lifestyle']");
//item will select all item nodes, regardless of their position in the tree, the condition is in [], $item is an array containing SimpleXML Elements.
Output:
foreach ($items as $item) echo $item->title . PHP_EOL;
see it working: https://eval.in/241693

SimpleXML create feed - loop gives wrong output

Having problem with creating a datafeed with simpleXML. Currently using a loop to put products inside a data feed but the data of all the products is inserted inside the first product. Giving me the following output:
<products>
<product>
<product_id>36440</product_id>
<product_name>Snoerloze ramenwasser</product_name>
<brand/>
<description>
<h1>Droge schone ramen in een handomdraai... streeploos!</h1> <h3>Dankzij de nieuwe, inventieve draadloze ramenreiniger</h3> <ol> <li> Licht in gewicht, compact en extreem krachtig</li> <li>Bespaart u tijd</li> <li> Een snelle en effectieve manier om zowel binnen als buiten al uw ramen streeploos schoon en droog te maken. </li> <li>Laat geen watersporen, strepen of druppels achter</li> </ol> <h3><br />Bent u die strepen op het raam ook zo beu? Dit is de nieuwe - tijdbesparende - leuke manier om uw ramen streeploos schoon te krijgen in een handomdraai. Al het vuile water wordt opgezogen, zonder een druppel achter te laten. </h3> <p>Bestreepte, vuile ramen zijn verleden tijd, dankzij de snoerloze ramenwasser. Hij is gemakkelijk in gebruik, ideaal om condens druppels of kalkplekken tegen te gaan en om natte plekken snel en eenvoudig op te zuigen. Ideaal ook in de badkamer. Omdat de ramenwasser draadloos is kunt u hem zowel binnen als buiten gebruiken. Serres, badkamers, tafels, ramen en zelfs de caravan zijn in mum van tijd sprankelend schoon. Werkt op 4 AA alkaline batterijen, welke u van ons GRATIS meegeleverd krijgt!</p> <h3>Kinderlijk eenvoudig...</h3> <p>Spray het raamoppervlak in met uw favoriete glas reiniger, maak de oppervlakte schoon met een doek, en zuig met de ramenwasser het water weg. Zonder een druppel achter te laten, helemaal STREEPLOOS!... zo simpel is het!</p> <h3>Al het water wordt opgezogen in het interne waterreservoir. Voor een kristal helder STREEPLOOS resultaat zonder druppels.</h3>
</description>
<short_description>
Heeft u moeite om ruiten en spiegels streeploos te reinigen? Met deze ruitenreiniger wist en zuigt u in één handomdraai. Snoerloos, dus handzaam en licht van gewicht. Het water drupt niet op uw kozijnen of vensterbank, maar wordt door deze reiniger volledig opgezogen. Nawrijven is overbodig. Ideaal voor alle gladde oppervlakken.
</short_description>
<product_id>36287</product_id>
<product_name>Rekbare tuinslang 7,5m</product_name>
<brand/>
<description>
<h2>De meest ideale tuinslang ter wereld!</h2> <p>Sluit deze slang aan op de kraan en als het water erdoor stroomt verdubbelt de slang in lengte. Ideaal voor de tuin of het wassen van de buitenramen. Zodra u de watertoevoer sluit, krimpt de slang weer tot een klein handzaam pakketje. Inclusief aansluitstuk en instalbare spuitkop.</p>
</description>
<short_description>
</product>
<product/>
</products>
To create this feed i'm using the following php code:
$xml = new SimpleXMLElement('<products></products>');
$products = _prepareCollection();
$obj = Mage::getModel('catalog/product');
foreach($products as $productid)
{
$_product = $obj->load($productid);
$model = Mage::getModel('catalog/product');
$_product = $model->load($productid);
$_product->getFinalPrice();
$product = $xml->addChild('product');
$product->addChild('product_id',$_product->getSku());
$product->addChild('product_name',$_product->getName());
$product->addChild('brand',$_product->getAttributeText('manufacturer'));
$product->addChild('description',html_entity_decode($_product->getDescription()));
$product->addChild('short_description',html_entity_decode($_product->getShortDescription()));
}
Hope anyone can help me with this problem. Thanks in advance!
Doesn't actually have an answer, but after adding more childs into the feed the problem solved itself.
Working code:
$xml = new SimpleXMLElement('<products></products>');
$products = _prepareCollection();
$obj = Mage::getModel('catalog/product');
foreach($products as $productid)
{
$_product = $obj->load($productid);
$model = Mage::getModel('catalog/product');
$_product = $model->load($productid);
$_product->getFinalPrice();
$product = $xml->addChild('product');
$product->addChild('product_id',$_product->getSku());
$product->addChild('product_name',$_product->getName());
$product->addChild('brand',$_product->getAttributeText('manufacturer'));
$product->addChild('description',html_entity_decode($_product->getDescription()));
$product->addChild('short_description',html_entity_decode($_product->getShortDescription()));
$product->addChild('promotion_details');
$product->addChild('deeplink',$_product->getProductUrl());
$product->addChild('delivery_period');
$product->addChild('delivery_cost','6.99');
$product->addChild('stock_level');
$product->addChild('stock_level_date');
$product->addChild('embargo');
$product->addChild('expiry');
$product->addChild('currency');
$product->addChild('display_price',$_product->getFinalPrice());
$product->addChild('price',$_product->getFinalPrice());
$product->addChild('image_thumbnail',$_product->getThumbnailUrl());
$product->addChild('image_url',$_product->getImageUrl());
$product->addChild('image_large_url',$_product->getImageUrl());
$product->addChild('language');
$cats = $_product->getCategoryIds();
$categories = $product->addChild('categories');
foreach($cats as $category_id)
{
$_cat = Mage::getModel('catalog/category')->load($category_id) ;
$category = $categories->addChild('category');
$category->addChild('category_id', $category_id);
$category->addChild('category_name',$_cat->getName());
}
}

Simplexml_load_string() does not load indexes

I am reading a XML file that has the following content:
<column name="title">
<![CDATA[
Sets inktcartridges geschikt voor Brother, Canon, Epson of HP printers (vanaf € 19,95)
]]>
</column>
<column name="description">
<![CDATA[
Niets zo storend als een printer zonder inkt als je net je 300 pagina’s tellende scriptie moet inleveren. Voorkom dit soort narigheden met cartridges voor verschillende printers in zwart en in kleur.
]]>
</column>
Every item will get an empty index when I parse the data with simplexml_load_string:
$xml = simplexml_load_string($data,'SimpleXMLElement',LIBXML_NOCDATA);
output:
[1] => Sets inktcartridges geschikt voor Brother, Canon, Epson of HP printers (vanaf € 19,95)
[2] => Niets zo storend als een printer zonder inkt als je net je 300 pagina’s tellende scriptie moet inleveren. Voorkom dit soort narigheden met cartridges voor verschillende printers in zwart en in kleur.
How can I tell simplexml_load_string that the name item in the column needs to be the index?
I think you cannot do that in a single go.. You could do like this..
<?php
$string = <<<XML
<?xml version='1.0'?>
<cols>
<column name="title">
<![CDATA[
Sets inktcartridges geschikt voor Brother, Canon, Epson of HP printers (vanaf € 19,95)
]]>
</column>
<column name="description">
<![CDATA[
Niets zo storend als een printer zonder inkt als je net je 300 pagina’s tellende scriptie moet inleveren. Voorkom dit soort narigheden met cartridges voor verschillende printers in zwart en in kleur.
]]>
</column>
</cols>
XML;
echo "<pre>";
$xml = simplexml_load_string($string,'SimpleXMLElement',LIBXML_NOCDATA);
$new_arr = array();
for($i=0;$i<count($xml->column);$i++)
{
$new_arr[(string)$xml->column[$i]->attributes()[0]]=trim(strip_tags($xml->column[$i]->saveXML()));
}
print_r($new_arr);
OUTPUT :
Array
(
[title] => Sets inktcartridges geschikt voor Brother, Canon, Epson of HP printers (vanaf € 19,95)
[description] => Niets zo storend als een printer zonder inkt als je net je 300 pagina’s tellende scriptie moet inleveren. Voorkom dit soort narigheden met cartridges voor verschillende printers in zwart en in kleur.
)
Working Demo

Is there a way to sort by pubdate in descending order

i read my rss.xml file out in a php file.
Now i want to sort the rss feed in descending pubdate order. Is this possible
<?php
$rss = simplexml_load_file('../../rssfeed.xml');
echo '<h1>'. $rss->channel->title . '</h1>';
foreach ($rss->channel->item as $item) {
echo '<h2>' . $item->title . "</h2>";
echo "<p>" . $item->pubDate . "</p>";
echo "<p>" . $item->description . "</p>";
}
?>
I was thinking about usort but i can't figure out how to get it to work...
xml rss code to test
<?xml version='1.0' encoding='ISO-8859-1'?>
<rss version='2.0'>
<channel>
<title>My RSS feed</title>
<item>
<title>01Home</title>
<description>De hoofdpagina van flux cms. Op deze pagina worden de features en plugins van flux cms weergegeven. Flux cms is enorm aanpasbaar zodat je je website kan maken zoals jij dat wil. Zo kan je bvb een eigen teplate aanmaken zodat je website volledig aan jou verwachtingen voldoet.</description>
<link>http://localhost/index.php?p=01Home</link>
<pubDate>2013 12 17</pubDate>
</item><item>
<title>02Gastenboek</title>
<description>Via het gastenboek kan je je bezoekers een bericht laten schrijven op je website dat leesbaar is voor alle andere sitegebruikers.</description>
<link>http://localhost/index.php?p=02Gastenboek</link>
<pubDate>2013 12 05</pubDate>
</item><item>
<title>03Albums</title>
<description>Via de albums plugin heb je de mogelijkheid om 5 albums aan te maken en weer te geven. Via een makelijk upload en verwijder systeem kan je afbeeldingen toevoegen en weer verwijderen. De albums zijn aanklikbaar en worden in een ooie slider weergegeven via een pop up.</description>
<link>http://localhost/index.php?p=03Albums</link>
<pubDate>2013 12 18</pubDate>
</item><item>
<title>04Videos</title>
<description>videos.</description>
<link>http://localhost/index.php?p=04Videos</link>
<pubDate>2013 12 18</pubDate>
</item><item>
<title>05Poll</title>
<description>Via deze plugin kan je makkelijk een poll toevoegen ergens op je website. Je kan een hoofdvraag stellen en max 4 mogelijke aantwoorden aanklikken. Handig om bvb te weten wat gebruikers van je site vinden.</description>
<link>http://localhost/index.php?p=05Poll</link>
<pubDate>2013 12 05</pubDate>
</item><item>
<title>06Events</title>
<description>Events van de kalender</description>
<link>http://localhost/index.php?p=06Events</link>
<pubDate>2013 12 17</pubDate>
</item><item>
<title>07Nieuwsbrief</title>
<description>Nieuwsbrief.</description>
<link>http://localhost/index.php?p=07Nieuwsbrief</link>
<pubDate>2013 11 12</pubDate>
</item><item>
<title>08Facebook</title>
<description>facebook</description>
<link>http://localhost/index.php?p=08Facebook</link>
<pubDate>2013 11 12</pubDate>
</item><item>
<title>09Zoeken</title>
<description>zoeken.</description>
<link>http://localhost/index.php?p=09Zoeken</link>
<pubDate>2013 11 12</pubDate>
</item><item>
<title>10statistieken</title>
<description>statistieken.</description>
<link>http://localhost/index.php?p=10statistieken</link>
<pubDate>2013 12 17</pubDate>
</item><item>
<title>11Profielen</title>
<description>profielen.</description>
<link>http://localhost/index.php?p=11Profielen</link>
<pubDate>2013 11 12</pubDate>
</item><item>
<title>12Privebericht</title>
<description>Plugin waarbij de sitegebruiker een bericht kan versturen naar de webbeheerder.</description>
<link>http://localhost/index.php?p=12Privebericht</link>
<pubDate>2013 11 12</pubDate>
</item><item>
<title>13Blog</title>
<description>blog.</description>
<link>http://localhost/index.php?p=13Blog</link>
<pubDate>2013 11 12</pubDate>
</item><item>
<title>14Kalender</title>
<description>kalender.</description>
<link>http://localhost/index.php?p=14Kalender</link>
<pubDate>2013 12 10</pubDate>
</item><item>
<title>15Search</title>
<description>Met deze functie kan je intern alle paginas zoeken. De zoekfunctie zoekt op de paginabeschrijvingswoorden die je opgeeft bij het creeren en bewerken van de pagina's.</description>
<link>http://localhost/index.php?p=15Search</link>
<pubDate>2013 12 04</pubDate>
</item><item>
<title>Album five</title>
<description>TEST</description>
<link>http://localhost/index.php?p=Album five</link>
<pubDate>2013 07 19</pubDate>
</item><item>
<title>Album four</title>
<description>TEST</description>
<link>http://localhost/index.php?p=Album four</link>
<pubDate>2013 03 23</pubDate>
</item><item>
<title>Album one</title>
<description>TEST</description>
<link>http://localhost/index.php?p=Album one</link>
<pubDate>2013 12 11</pubDate>
</item><item>
<title>Album three</title>
<description>TEST</description>
<link>http://localhost/index.php?p=Album three</link>
<pubDate>2013 03 23</pubDate>
</item><item>
<title>Album two</title>
<description>TEST</description>
<link>http://localhost/index.php?p=Album two</link>
<pubDate>2013 03 23</pubDate>
</item><item>
<title>antiquar</title>
<description>TEST</description>
<link>http://localhost/index.php?p=antiquar</link>
<pubDate>2013 06 13</pubDate>
</item><item>
<title>login</title>
<description>TEST</description>
<link>http://localhost/index.php?p=login</link>
<pubDate>2013 06 11</pubDate>
</item><item>
<title>news</title>
<description>TEST</description>
<link>http://localhost/index.php?p=news</link>
<pubDate>2013 04 01</pubDate>
</item><item>
<title>registreer</title>
<description>TEST</description>
<link>http://localhost/index.php?p=registreer</link>
<pubDate>2013 04 23</pubDate>
</item></channel></rss>
i would do it like this...
<?php
$rss = simplexml_load_file('../../rssfeed.xml');
echo '<h1>'. $rss->channel->title . '</h1>';
foreach ($rss->channel->item as $item) {
$tmp = str_replace(" ","",$item->pubDate);
$div[$tmp][] = "<h2><a href='{$item->link}'>{$item->title}</a></h2>" .
"<p>{$item->pubDate}</p>" .
"<p>{$item->description}</p>";
}
array_multisort($div,SORT_DESC);
foreach($div as $d)
{
foreach($d as $output) echo $output;
}
?>
by the way... i would always collect data in a array or variable befor echo'ing it.
if you have some issues you can easy turn of the output on one position and don't need to edit your code in 50 lines :)
i added replace to get the whitespaces out of your pupdate. i don't know if whitespaces causes errors when you use them in arraykey. anyway... this is more clean :)
and it's a 2 demensional array because you have equal pupdates.
Just do that:
usort($rss->channel->item, function($a,$b) {
return strtotime($a->pubdate)-strtotime($b->pubdate);
});
Now, complete code:
<?php
$rss = simplexml_load_file('../../rssfeed.xml');
$json_rss = json_encode($xml);
$rss = json_decode($json_rss,TRUE);
usort($rss->channel->item, function($a,$b) {
return strtotime($a->pubdate)-strtotime($b->pubdate);
});
echo '<h1>'. $rss->channel->title . '</h1>';
foreach ($rss['channel']['item'] as $item) {
echo '<h2>' . $item['title'] . "</h2>";
echo "<p>" . $item['pubDate'] . "</p>";
echo "<p>" . $item['description'] . "</p>";
}
?>

Wordpress posts to xml

I have a project where i have to link values given the wordpress backend to xmls, since i am new to Worpress i don't know where to start.
So the xml looks like this
<?xml version="1.0"?>
<articles>
<article>
<title><![CDATA[Teddiedrum - The Audience]]>
</title>
<image><![CDATA[http://niteversions.com/uploads/Teddiedrum-The-Audience-490x490.jpg]]>
</image>
<content>
<![CDATA[Oei.]]>
</content>
<date>
<![CDATA[16/04/2012]]>
</date>
</article>
<article>
<title><![CDATA[Soap&Skin - Boat Turns Toward The Port ]]>
</title>
<image><![CDATA[http://neuundgut.zib21.com/wp-content/uploads/2011/12/soap-skin-boat-turns-towards-the-boat-video.jpg]]>
</image>
<content>
<![CDATA[Elke aanleiding moéten we gebruiken om deze magistrale Soap&Skin-song te posten. We geraken immers nog steeds niet uit de wurggreep van ‘Boat Turns Toward The Port’. De 22-jarige Anja Plaschg slaat ons, op amper 2:30, compleet murw met dit hartverscheurend, schuifelend treurlied. Alle haren overeind, woensdagavond in AB, Brussel.]]>
</content>
<date>
<![CDATA[17/04/2012]]>
</date>
</article>
<article>
<title><![CDATA[Mr. Scruff Vs Kirsty Almeida - Pickled Spider]]>
</title>
<image><![CDATA[http://ecx.images-amazon.com/images/I/41HRpRNhG-L.jpg]]>
</image>
<content>
<![CDATA[De dolgedraaide Ninja Tuner Mr Scruff palmt vrijdag - van 20u30 tot 2u (!) - het podium van de Brusselse VK* in. Mail snel naar filip.rifraf#skynet.be met als subject Mr. Scruff voor één van de 3 gratis duotickets. De winnaars maken we hier donderdag bekend. “Maar als je niet tegen vette bassen kan, ben blijf je beter thuis”, waarschuwt hij. Doe de bass-test met deze ‘Pickled Spider’.]]>
</content>
<date>
<![CDATA[18/04/2012]]>
</date>
</article>
<article>
<title><![CDATA[DJ Muggs feat Dizzee Rascal & Bambu - Snap Ya Neck Back]]>
</title>
<image><![CDATA[http://www.danceeuphoria.com/wp-content/uploads/2012/03/djmuggssnapyaneckback.jpg]]>
</image>
<content>
<![CDATA[Een goed jaar geleden op de RifRaf-cover, nu bruutweg een banaan molesterend. Tsssss.]]>
</content>
<date>
<![CDATA[18/04/2012]]>
</date>
</article>
<article>
<title><![CDATA[Steak Number Eight - Dickhead]]>
</title>
<image><![CDATA[http://userserve-ak.last.fm/serve/500/6144813/Steak+Number+Eight++010.jpg]]>
</image>
<content>
<![CDATA[Een goed jaar geleden op de RifRaf-cover, nu bruutweg een banaan molesterend. Tsssss.]]>
</content>
<date>
<![CDATA[19/04/2012]]>
</date>
</article>
<article>
<title><![CDATA[The Heart Is A Drum - Drums Are For Parades feat. Tim Vanhamel]]>
</title>
<image><![CDATA[http://www.liegecity.be/wp-content/uploads/2012/03/DrumsAreForParade.jpg]]>
</image>
<content>
<![CDATA[De 'IMPERIVM’-picture disc van Drums Are For Parades is één van de vele, unieke releases nav Record Store Day, nu zaterdag. Drums Are For Parades sluiten trouwens die hoogdag van de onafhankelijke platenwinkels ’s avonds live af in Handelsbeurs, Gent. Uit ‘IMPERIVM’, deze ‘The Heart Is A Drum’ feat. Tim Vanhamel.]]>
</content>
<date>
<![CDATA[20/04/2012]]>
</date>
</article>
</articles>
What i want is to make fields in the backend like title, image, content, date and everytime this field is saved it adds a new node to the xml.
Any information on how to start doing this / the steps i have to undertake would be welcome.
Kind regards
Toon
There's already 2 tools available in wordpress import and export xml in backend just install that and you'll get what you want there's no need to do any custom thing on every post but if you still want it then read about 'publish_post' hook
As mentioned, your best bet would be to search existing plugins. I would start with this one and maybe see about modifying it to your needs:
http://wordpress.org/extend/plugins/backwpup/

Categories