netXML
This Wiki is about functions to help create, edit and query XML variables and files. They are using a combination of Dyalog ⎕XML and .Net. You should already be familiar with ⎕XML, if not you can reach the online help at http://help.dyalog.com/ and search for 'XML Convert'.
Element
Element is used to build a ⎕XML element. The return value is an array with 1 row and 5 columns as per the ⎕XML format. Typical uses are like this:
⎕XML 'name' Element 'content' <name>content</name> ⎕XML 'name' ('attribute1' 'value1') Element 'content' <name attribute1="value1">content</name> ⎕XML 'name' (('attribute1' 'value1')('attribute2' 'value2')) Element 'content' <name attribute1="value1" attribute2="value2">content</name> ⎕XML '⍝' Element 'This is a comment' <!-- This is a comment --> ⎕XML '?' Element 'xml version="1.0" encoding="UTF-8"' <?xml version="1.0" encoding="UTF-8"?> ⎕XML '!' Element 'DOCTYPE root_element SYSTEM "DTD_location"' <!DOCTYPE root_element SYSTEM "DTD_location"> book ← '⍝' Element 'This is a good book' book⍪ ← 'author' Element 'Gambardella, Matthew' book⍪ ← 'title' Element 'XML Developer''s Guide' book⍪ ← 'genre' Element 'Computer' book⍪ ← 'price' Element 44.95 ⎕XML book <!-- This is a good book --> <author>Gambardella, Matthew</author> <title>XML Developer's Guide</title> <genre>Computer</genre> <price>44.95</price>
Elements
Elements will call the function Element repetitively on it's arguments to simplify the coding:
book ← '⍝' 'author' 'title' 'genre' 'price' Elements 'This is a good book' 'Gambardella, Matthew' 'XML Developer''s Guide' 'Computer' 44.95 ⎕XML book <!-- This is a good book --> <author>Gambardella, Matthew</author> <title>XML Developer's Guide</title> <genre>Computer</genre> <price>44.95</price>
AddParent
AddParent is used to encapsulate a children with its parent. The left argument is the parent's name with optionally attributes and the right argument is a ⎕XML array. Here is a typical example:
book ← 'book'('id' 'bk101') AddParent book ⎕XML book <book id="bk101"> <!-- This is a good book --> <author>Gambardella, Matthew</author> <title>XML Developer's Guide</title> <genre>Computer</genre> <price>44.95</price> </book>
XPath
There are no XML query features included with ⎕XML. We need to use .Net for that. First let's generate the following XML:
⍝ Example taken from: https://msdn.microsoft.com/en-us/library/ms762271%28v=VS.85%29.aspx books ← 0 5⍴'' books⍪ ← '⍝' Element 'This is a comment' book ← 'author' 'title' 'genre' Elements 'Gambardella, Matthew' 'XML Developer''s Guide' 'Computer' book⍪ ← 'price' 'publish_date' Elements 44.95 '2000-10-01' book⍪ ← 'description' Element 'An in-depth look at creating applications with XML.' book ← 'book'('id' 'bk101') AddParent book books⍪ ← book book ← 'author' 'title' 'genre' Elements 'Ralls, Kim' 'Midnight Rain' 'Fantasy' book⍪ ← 'price' 'publish_date' Elements 5.95 '2000-12-16' book⍪ ← 'description' Element 'A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.' book ← 'book'('id' 'bk102') AddParent book books⍪ ← book book ← 'author' 'title' 'genre' Elements 'Corets, Eva' 'Maeve Ascendant' 'Fantasy' book⍪ ← 'price' 'publish_date' Elements 5.95 '2000-11-17' book⍪ ← 'description' Element 'After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.' book ← 'book'('id' 'bk103') AddParent book books⍪ ← book book ← 'author' 'title' 'genre' Elements 'Corets, Eva' 'Oberon''s Legacy' 'Fantasy' book⍪ ← 'price' 'publish_date' Elements 5.95 '2001-03-10' book⍪ ← 'description' Element 'In post-apocalypse England, the mysterious agent known only as Oberon helps to create a new life for the inhabitants of London. Sequel to Maeve Ascendant.' book ← 'book'('id' 'bk104') AddParent book books⍪ ← book catalog ← 'catalog' AddParent books ⎕XML catalog <catalog> <!-- This is a comment --> <book id="bk101"> <author>Gambardella, Matthew</author> <title>XML Developer's Guide</title> <genre>Computer</genre> <price>44.95</price> <publish_date>2000-10-01</publish_date> <description>An in-depth look at creating applications with XML.</description> </book> <book id="bk102"> <author>Ralls, Kim</author> <title>Midnight Rain</title> <genre>Fantasy</genre> <price>5.95</price> <publish_date>2000-12-16</publish_date> <description>A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.</description> </book> <book id="bk103"> <author>Corets, Eva</author> <title>Maeve Ascendant</title> <genre>Fantasy</genre> <price>5.95</price> <publish_date>2000-11-17</publish_date> <description>After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.</description> </book> <book id="bk104"> <author>Corets, Eva</author> <title>Oberon's Legacy</title> <genre>Fantasy</genre> <price>5.95</price> <publish_date>2001-03-10</publish_date> <description>In post-apocalypse England, the mysterious agent known only as Oberon helps to create a new life for the inhabitants of London. Sequel to Maeve Ascendant.</description> </book> </catalog>
After that we need to obtain a .Net XmlDocument by using the function AplToXmlDoc on the ⎕XML array:
doc ← AplToXmlDoc catalog doc System.Xml.XmlDocument
Then we can use the function XPath with an XPath expression and a .Net XmlDocument to obtain a collection of .Net Xml nodes. If a node is modified from that collection, the parent XmlDocument will be modified also accordingly (Examples for XPath can be found at: https://msdn.microsoft.com/en-us/library/ms256086%28v=vs.110%29.aspx). Here are some examples:
⍝ To Modify the price of the book that has the title "XML Developer's Guide" to 54.95 node ← doc XPath '//book[title="XML Developer''s Guide"]/price' node[0].InnerText ← '54.95' ⍝ To Remove the node with the title "Midnight Rain" node ← doc XPath '//book[title="Midnight Rain"]' {}doc.DocumentElement.RemoveChild node[0] ⍝ To find the attribute of the first book nodes ← doc XPath'//book[1]' nodes[0].Attributes[0].(Name Value) id bk101 ⍝ To find the genre of all the books nodes ← doc XPath'//book/genre' (⌷nodes).InnerText Computer Fantasy Fantasy ⍝ To find how many books has a price of $5.95 nodes ← doc XPath'//book/price[text()="5.95"]' nodes.Count 2
The XmlDocument is reverted back to the ⎕XML array by using XmlDocToApl:
catalog ← XmlDocToApl doc
AppendElement
To append some XML elements, prepare a ⎕XML array first:
book ← 'author' 'title' 'genre' Elements 'Corets, Eva' 'The Sundered Grail' 'Fantasy' book⍪ ← 'price' 'publish_date' Elements 5.95 '2001-09-10' book⍪ ← 'description' Element 'The two daughters of Maeve, half-sisters, battle one another for control of England. Sequel to Oberon''s Legacy.' book ← 'book'('id' 'bk105') AddParent book
Then you can use the function AppendElement with a XmlDocument:
doc AppendElement book
Or you can catenate in APL after adjusting the first column of the ⎕XML array for the proper depth level:
book[;1]+←1 catalog⍪←book
File Operations
You can use the functions AplToFile and FileToApl to Save and Retrieve a ⎕XML array to a file (see comments of each functions for more details).
catalog AplToFile 'd:\fileName.xml' 1 catalog ← 2⊃FileToApl 'd:\fileName.xml'
How to install netXML in your workspace
Download netXML.v1.1.txt
- Do a Select all (Ctrl+A) and a copy (Ctrl+C).
In your workspace execute )ed ⍟ netXML
- Paste (Ctrl+V) the text into the Dyalog editor
- Press Escape and ')save' your workspace
Optionally to de-script the namespace you can do:
#.netXML←{('n' ⎕NS ⍵)⊢n←⎕NS ''}#.netXML
Version Information
Version 1.0 August 2015, Pierre Gilbert Version 1.1 August 2015 Method Comment has been replaced by: '⍝' Element 'CommentContent' Added: '?' Element 'DeclarationContent' Added: '!' Element 'DeclarationContent'
Original author: |
Pierre Gilbert |
Responsible: |
|
Email: |
<apgil AT SPAMFREE videotron DOT ca> |
See also: wpfXmlBindingDemo will convert an APL nameless namespace to Xml and vice-versa.wpfXamlEditor for a XML editor. XsltTransform to apply a XSLT transform to a XML file. The workspace ws\loaddata.dws included with Dyalog has the functions LoadXML and SaveXML that are giving an example of how to use ⎕SE.Parser that may be useful in some cases.
CategoryDyalog - CategoryDyalogDotNet - CategoryDyalogDotNetUtilities - CategoryDotNet