BuildRowSetFromXML
This function creates a row set from an XML string. It returns an error or an empty row set if no XML matches the specified XPATH.
Arguments
BuildRowSetFromXML(1,2,3)
Ordinal | Type | Required | Description |
---|---|---|---|
1 | String | True | Source XML string to parse |
2 | String | True | XPATH string that specifies the root XML node from which to build the row set |
3 | Boolean | True | Return an empty row set if XPATH is not found in source string |
NOTE: This function supports the XPATH 1.0 specification.
NOTE: The following nodes will return no value:
- CDATA
- Comment
- Document
- Document Fragments
- DocumentType
- Entities
- Entity References
- Notation
- ProcessingInformation
- Whitespace
- XmlDeclaration
Example 1
The following example retrieves XML node values:
%%[
var @xml, @isXML, @nodes, @rowCount
set @xml = ""
set @xml = concat(@xml, '<?xml version="1.0" encoding="UTF-8"?>')
set @xml = concat(@xml, '<cart>')
set @xml = concat(@xml, ' <items>')
set @xml = concat(@xml, ' <item>')
set @xml = concat(@xml, ' <sku><![CDATA[123]]></sku>')
set @xml = concat(@xml, ' <name><![CDATA[Square]]></name>')
set @xml = concat(@xml, ' <url><![CDATA[https://limedash.com?sku=123]]></url>')
set @xml = concat(@xml, ' </item>')
set @xml = concat(@xml, ' <item>')
set @xml = concat(@xml, ' <sku><![CDATA[456]]></sku>')
set @xml = concat(@xml, ' <name><![CDATA[Circle]]></name>')
set @xml = concat(@xml, ' <url><![CDATA[https://limedash.com?sku=456]]></url>')
set @xml = concat(@xml, ' </item>')
set @xml = concat(@xml, ' <item>')
set @xml = concat(@xml, ' <sku><![CDATA[789]]></sku>')
set @xml = concat(@xml, ' <name><![CDATA[Triangle]]></name>')
set @xml = concat(@xml, ' <url><![CDATA[https://limedash.com?sku=789]]></url>')
set @xml = concat(@xml, ' </item>')
set @xml = concat(@xml, ' </items>')
set @xml = concat(@xml, '</cart> ')
if indexOf(@xml,"<cart>") > 0 then
set @nodes = BuildRowsetFromXML(@xml,"/cart/items/item",0)
set @rowCount = rowcount(@nodes)
if @rowCount > 0 then
for @i = 1 to @rowCount do
var @sku
var @name
var @url
set @nodepath = concat("/cart/items/item[",@i,"]/")
if rowcount(BuildRowsetFromXML(@xml,concat(@nodepath,"sku"))) > 0 then
set @sku = Field(Row(BuildRowsetFromXML(@xml,concat(@nodepath,"sku"),0),1),'Value')
endif
if rowcount(BuildRowsetFromXML(@xml,concat(@nodepath,"name"))) > 0 then
set @name = Field(Row(BuildRowsetFromXML(@xml,concat(@nodepath,"name"),0),1),'Value')
endif
if rowcount(BuildRowsetFromXML(@xml,concat(@nodepath,"url"))) > 0 then
set @url = Field(Row(BuildRowsetFromXML(@xml,concat(@nodepath,"url"),0),1),'Value')
endif
if not empty(@sku) and not empty(@name) and not empty(@url) then
]%%
<br><a href="%%=redirectto(@url)=%%">%%=v(@name)=%% (%%=v(@sku)=%%)</a>
%%[
endif
next @i
else
output(concat("<br>no products found"))
endif
else
output(concat("<br>no XML found"))
endif
]%%
Output
<br><a href="https://limedash.com/?sku=123">Square (123)</a>
<br><a href="https://limedash.com/?sku=456">Circle (456)</a>
<br><a href="https://limedash.com/?sku=789">Triangle (789)</a>
Example 2
The following example retrieves values from the XML node attributes:
%%[
var @xml, @isXML, @nodes, @rowCount
set @xml = ""
set @xml = concat(@xml, '<?xml version="1.0" encoding="UTF-8"?>')
set @xml = concat(@xml, '<cart>')
set @xml = concat(@xml, ' <item sku="123" url="https://limedash.com?sku=123">Square</item>')
set @xml = concat(@xml, ' <item sku="246" url="https://limedash.com?sku=246">Circle</item>')
set @xml = concat(@xml, ' <item sku="789" url="https://limedash.com?sku=789">Triangle</item>')
set @xml = concat(@xml, '</cart> ')
if indexOf(@xml,"<cart>") > 0 then
set @nodes = BuildRowsetFromXML(@xml,"/cart/item",0)
set @rowCount = rowcount(@nodes)
if @rowCount > 0 then
for @i = 1 to @rowCount do
var @sku
var @name
var @url
set @nodepath = concat("/cart/item[",@i,"]/")
if rowcount(BuildRowsetFromXML(@xml,concat(@nodepath,"@sku"))) > 0 then
set @sku = Field(Row(BuildRowsetFromXML(@xml,concat(@nodepath,"@sku"),0),1),'Value')
endif
if rowcount(BuildRowsetFromXML(@xml,concat(@nodepath,"@url"))) > 0 then
set @url = Field(Row(BuildRowsetFromXML(@xml,concat(@nodepath,"@url"),0),1),'Value')
endif
if rowcount(BuildRowsetFromXML(@xml,concat(@nodepath,"text()"))) > 0 then
set @name = Field(Row(BuildRowsetFromXML(@xml,concat(@nodepath,"text()"),0),1),'Value')
endif
if not empty(@sku) and not empty(@name) and not empty(@url) then
]%%
<br><a href="%%=redirectto(@url)=%%">%%=v(@name)=%% (%%=v(@sku)=%%)</a>
%%[
endif
next @i
else
output(concat("<br>no products found"))
endif
else
output(concat("<br>no XML found"))
endif
]%%
Output
<br><a href="https://limedash.com/?sku=123">Square (123)</a>
<br><a href="https://limedash.com/?sku=456">Circle (456)</a>
<br><a href="https://limedash.com/?sku=789">Triangle (789)</a>