Skip to main content

XML

A service to read XML format files as an object or list variable

This service is used to convert XML files into variables to be used within an OpenDataDSL script.

Syntax

The standard active variable syntax is followed with the id part being the URL of the XML file, e.g.

xmldata = ${xml:"https://domain/example.xml", options}

Options

The following options affect the way that the XML data is processed into the variable:

OptionDescriptionExample
selectorThis is an XML selector which allows you to filter the xml data. It is a CSS-like element selector, that finds elements matching a query. If a selector is used, the output variable is a listselector=[type=”test”]
ignoreContentTypeSet this to true if the document content type is causing exceptionsignoreContentType=true
xsltTransforms the input XML data using the supplied XSLT transformer"xslt="+xslt

Example

This example uses the following XML format file of FX Rates from the European Central Bank obtainable from

https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml

<?xml version="1.0" encoding="UTF-8"?>
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
<gesmes:subject>Reference rates</gesmes:subject>
<gesmes:Sender>
<gesmes:name>European Central Bank</gesmes:name>
</gesmes:Sender>
<Cube>
<Cube time='2021-06-03'>
<Cube currency='USD' rate='1.2187'/>
<Cube currency='JPY' rate='133.81'/>
<Cube currency='BGN' rate='1.9558'/>
<Cube currency='CZK' rate='25.448'/>
<Cube currency='DKK' rate='7.4365'/>
<Cube currency='GBP' rate='0.85955'/>
<Cube currency='HUF' rate='345.82'/>
<Cube currency='PLN' rate='4.4520'/>
<Cube currency='RON' rate='4.9220'/>
<Cube currency='SEK' rate='10.1145'/>
<Cube currency='CHF' rate='1.0961'/>
<Cube currency='ISK' rate='146.30'/>
<Cube currency='NOK' rate='10.1501'/>
<Cube currency='HRK' rate='7.5013'/>
<Cube currency='RUB' rate='89.2163'/>
<Cube currency='TRY' rate='10.5650'/>
<Cube currency='AUD' rate='1.5792'/>
<Cube currency='BRL' rate='6.1894'/>
<Cube currency='CAD' rate='1.4710'/>
<Cube currency='CNY' rate='7.7910'/>
<Cube currency='HKD' rate='9.4551'/>
<Cube currency='IDR' rate='17420.91'/>
<Cube currency='ILS' rate='3.9598'/>
<Cube currency='INR' rate='88.8755'/>
<Cube currency='KRW' rate='1357.75'/>
<Cube currency='MXN' rate='24.3300'/>
<Cube currency='MYR' rate='5.0241'/>
<Cube currency='NZD' rate='1.6915'/>
<Cube currency='PHP' rate='58.208'/>
<Cube currency='SGD' rate='1.6141'/>
<Cube currency='THB' rate='37.938'/>
<Cube currency='ZAR' rate='16.5218'/>
</Cube>
</Cube>
</gesmes:Envelope>

Retrieving the XML

Running the following code:

xmldata=${xml:"https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"}
print xmldata

Produces an object looking something like this:

{
"_id": "xmldata",
"Cube": {
"_id": "Cube",
"Cube": {
"_id": "Cube",
"Cube": \[
{
"_id": "Cube",
"content": "",
"currency": "USD",
"rate": 1.2187
},
{
"_id": "Cube",
"content": "",
"currency": "JPY",
"rate": 133.81
}

...

\],
"content": "",
"time": "2021-06-03"
},
"content": ""
},
"Sender": {
"_id": "Sender",
"content": "European Central Bank",
"name": {
"_id": "name",
"content": "European Central Bank"
}
},
"subject": {
"_id": "subject",
"content": "Reference rates"
}
}

Using a selector

If you use a selector to only select nodes that have a currency attribute:

xmldata=${xml:"https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml", "selector=\[currency\]"}
print xmldata

You get a list of objects containing only the currencies and rates like this:

[
{
"content": "",
"currency": "USD",
"rate": 1.2187
}
{
"content": "",
"currency": "JPY",
"rate": 133.81
}

...

]

Using an XSLT

You can create an XSLT that transforms the XML, see the example below:

xslt=`<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="no"/>

<xsl:template match="/">
<xsl:variable name="time" select="//@time"/>
<currencies time="{$time}">
<xsl:for-each select="//@currency">
<currency code="{.}" rate="{../@rate}" />
</xsl:for-each>
</currencies>
</xsl:template>

</xsl:stylesheet>
`

xmldata=${xml:"https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml","xslt="+xslt}

print json(xmldata)