XPath voor random tip uit XML bestand

14-03-2011 | Marcel van Langen | ColdFusion | xml, xpath, willekeurig, child, node

Stel, je wilt uit een lijst met tips bij ieder request een random tip tonen. Niet geheel fictief, want de oplettende lezer zal de random SEO tip in de rechterbalk zijn opgevallen. Maar goed, ColdFusion biedt de gebruiker een scala aan mogelijkheden om dit te realiseren. Mij leek het wel leuk om dit met XPath te doen. XPath biedt veel mogelijkheden om snel een XML bestand te doorzoeken op basis van op te geven parameters. Doorklikken laat zien hoe eenvoudig het is.

Dit onderdeel was een kleine vingeroefening om de basisfunctionaliteit van XPath te leren kennen. Het is bijzonder eenvoudig om op basis hiervan XPath verder te leren kennen. Enige basiskennis van de opbouw van XML bestanden is natuurlijk wel gewenst.

Om te beginnen heb ik een XML bestand nodig waarin ik de tips ga opslaan. Dit XML bestand kent een zeer eenvoudige structuur, die als volgt is opgebouwd:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<tips>
<tip>Lorem ipsum</tip>
<tip>Lorem ipsum</tip>
</tips>

Veel eenvoudiger kan een XML bestand niet. Omdat ik liever niet wil dat gebruikers het XML bestand direct kunnen opvragen, heb ik het bestand opgeslagen onder de naam seotip.xml.cfm. Let daarbij op de toevoeging van de .cfm. Ik wil natuurlijk niet dat het bestand iedere keer opnieuw wordt opgehaald, dus ik lees het bestand in in de application scope. Dit doe ik met de volgende code:

<cfif Not IsDefined("application.xmlDocObj")>
<cflock timeout="10" throwontimeout="yes" type="exclusive" scope="application">
<cffile action="read" file="#ExpandPath("./")#seotip.xml.cfm" variable="seoTips" />
<cfset application.xmlDocObj = XmlParse(seoTips) />
</cflock>
</cfif>

Eerst wordt gekeken of de variabele al bestaat in de application scope. Zo niet, dan wordt een lock gezet om het bestand in te kunnen lezen en om te zetten naar een XML object. Het resultaat is een XML object in de application scope dat door XPath kan worden gebruikt. De laatste stap is het verkrijgen van de random tip vanuit dit object. Hiervoor heb ik de volgende code nodig:

<cfset variables.totaal_aantal_tips = XmlSearch(application.xmlDocObj, "count(tips/tip)") />
<cfset variables.random_item = RandRange(1,variables.totaal_aantal_tips) />
<cfset variables.arrayRandomItem = XmlSearch(application.xmlDocObj, "tips/tip[#variables.random_item#]") />
<cfset variables.tip = variables.arrayRandomItem[1].XmlText />

Door eerst XPath te gebruiken om het aantal nodes te tellen en vervolgens hieruit een semi-random item te selecteren, hebben we een variables.tip die we kunnen gebruiken. Helaas is het niet mogelijk om binnen XPath dynamisch de XmlText variabele te selecteren, waardoor de laatste twee regels niet kunnen worden samengevoegd. Voor de volledigheid: de volgende code toont de tip in de browser:

<cfoutput>#variables.tip#</cfoutput>

Over Morloff

Morloff ontwerpt en realiseert succesvolle webtoepassingen op het gebied van procesoptimalisatie, eCommerce en rapportage door de inzet van moderne webtechnieken, sociale media en zoekmachine optimalisatie.

over ons | diensten | portfolio | contact | route

naar website IJsmonster.nl naar website ICT intermediairs naar website marcelvanlangen.com

Twitter

Morloff

Cuneraweg 169a
3911 RH Rhenen

M +31 (0)6 - 515 96 189
W www.morloff.nl
E contactformulier

Morloff op Twitter Morloff op Facebook Morloff op LinkedIn Morloff via RSS