Skip to main content

Parsing XML Documents in the CMS: 2 Methods

To start off with do this:

Dim txt
Dim fieldStart, fieldEnd
Dim xml
Dim fields
Dim ltxt
Dim key
Dim value

txt = trim(content.item("_cmsEmailBody"))
ltxt = lcase(txt)

fieldStart = inStr(ltxt, "<root>")
fieldEnd = inStr(ltxt, "</root>")
if fieldStart >= fieldEnd then
content.add "_cmsError", "Invalid email format. No XML data detected."
exit Sub
end if

' skip the end /root
fieldEnd = fieldEnd + 6
set xml = system.createXML()
if not xml.loadXML(mid(txt, fieldStart, fieldEnd)) then
content.add "_cmsError", "Invalid XML format."
exit Sub
end if


Now there are two ways to parse it.

Method 1:

set fields = xml.selectSingleNodeAsContent("root")


Method 2:

set fields = xml.selectSingleNodeAsDic("root")



Check to make sure we have the root node:


if not isObject(fields) then
content.add "_cmsError", "Invalid xml format. Missing root /root node."
exit Sub
end if


If Method 1 was used:


if isObject(fields) then
for each key in fields
value = fields.item(key)
' do any renaming/processing here
if LCase(key) = "txt_body" then
value = util.convertTextToHTML(value)
end if

' skip over token and save the rest
if LCase(key) <> "token" then
content.add key, value
end if

next
end if


If method 2 was used print out the fields so we know what we are dealing with:

debug.write(fields)


Basicallay it will return with a dictionary (key, value pair) with the following syntax:

Element.ChildElement = value
Element.ChildElement.ChildChildElement = value

To access the values just do a:

fields.item("Element.ChildElment")


Note: If Elements at the same level appear you may have the following:

Element.ChildElement = value
Element.2.ChildElement = value

Look at what the debug.write(fields) prints out to be sure. The count of each Element will be included here too so make sure to print out debug.write(fields).

Comments

blahblahyaya said…
Thanks! I couldn't remember that selectSingleNodeAsDic was the function to use.

Popular posts from this blog

Questions about Outages

Routine CMS maintentance windows are from 6pm - 7pm, every Monday and Wednesday. Generally, the system is still available during these times, but may be unavailable for a few minutes during that period. There are other times where maintenance must be performed outside these windows due to unforeseen circumstances. We aim to provide as much notice as possible for these events, typically via email and via an alert on the login page. The routine maintenance is also mentioned on the login page on the day of maintenance.

Checking / Creating New Folders from an SMTP Import

To check if a folder exists in the CMS already you have to create a folder list. There is no direct commands to do this. dim folderExists folderExists = false set folderlist = asset.getFolderList("/path/") 'loop through folder list do while folderlist.nextEntry() if folderlist.item("_cmsLabel") = "foldername" folderExists = true exit do end if loop To create a folder in the CMS, first make a Model that only contains a folder. Then do the following: if folderExists = false then 'create folder set dict = system.createDictionary() fId = asset.create(folderName, "/Site/Global/Picture of the Week/", "/System/Models/Directory Builder", dict) end if The parameters for the asset.create("label", "Path", "Model to use", content or dictionary)

Laravel 5.1 - Posting and Retrieving JSON

This is how you can use jQuery to POST data and retrieve it within the controllers. To Send Data: First off on the page where you are POSTing data from, you need to have a CSRF_TOKEN as a meta tag. <meta name="csrf_token" content="{{ csrf_token() }}" /> Then in the JavaScript, pull the token and send it along with the POST as headers. <script type="text/javascript"> var CSRF_TOKEN = $('meta[name="csrf_token"]').attr('content');    var jsonData = "{ 'data' : 'data' }";   $.ajax({     url: '/route/path',         type: 'POST',     data: jsonData,     headers: {      'X-CSRF-TOKEN': CSRF_TOKEN     },        dataType: 'JSON',     success: function (data) { } }); </script> To Retrieve Data: Setup a post route in /app/Http/routes.php Route::post('/route/path', 'ControllerName@controllerMethod' ); Then setup the controller