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

  1. Download netXML.v1.1.txt

  2. Do a Select all (Ctrl+A) and a copy (Ctrl+C).
  3. In your workspace execute )ed ⍟ netXML

  4. Paste (Ctrl+V) the text into the Dyalog editor
  5. 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:

PierreGilbert

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

netXML (last edited 2015-08-29 22:12:29 by PierreGilbert)