{{#invoke:Infobox|infobox}}Template:Template other{{#invoke:Check for unknown parameters | check | showblankpositional=1 | unknown = Template:Main other | preview = Page using Template:Infobox software with unknown parameter "_VALUE_"|ignoreblank=y | AsOf | author | background | bodystyle | caption | collapsetext | collapsible | developer | discontinued | engine | engines | genre | included with | language | language count | language footnote | latest preview date | latest preview version | latest release date | latest release version | latest_preview_date | latest_preview_version | latest_release_date | latest_release_version | licence | license | logo | logo alt | logo caption | logo upright | logo size | logo title | logo_alt | logo_caption | logo_upright | logo_size | logo_title | middleware | module | name | operating system | operating_system | other_names | platform | programming language | programming_language | released | replaced_by | replaces | repo | screenshot | screenshot alt | screenshot upright | screenshot size | screenshot title | screenshot_alt | screenshot_upright | screenshot_size | screenshot_title | service_name | size | standard | title | ver layout | website | qid }}Template:Main other

HaXml is a collection of utilities for parsing, filtering, transforming, and generating Extensible Markup Language (XML) documents using the programming language Haskell.<ref name="zenodo">Template:Cite journal</ref>

OverviewEdit

HaXml utilities include:<ref name="zenodo"/><ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>

HaXml provides a combinator library with a set of higher-order functions which process the XML documents after they are represented using the native Haskell data types.<ref>Template:Cite report</ref> The basic data type is Content which represents the document subset of XML.<ref>Template:Cite book</ref>

HaXml allows converting XML to Haskell data and vice versa, and XML to XML (by transforming or filtering). The common use of the HaXml's parser includes defining the method of traversing the XML data and it has the CFilter type (content filter), where type CFilter = Content -> [Content]. It means that this function defined by the user will take a fragment of an XML data and either return more fragments or none at all. This approach allows to choose XML elements satisfying certain conditions (e.g., tags with certain name or all children of a specified tag).<ref name="real">Template:Cite book</ref><ref>Template:Cite journal</ref>

ExampleEdit

In the chapter 22 "Extended Example: Web Client Programming" of the Real World Haskell by Bryan O'Sullivan, Don Stewart, and John Goerzen, the following example is considered.<ref name="real"/> The XML file looks like this (simplified version):

<syntaxhighlight lang="xml"> <?xml version="1.0" encoding="UTF-8"?> <rss xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd" version="2.0">

 <channel>
   <title>Haskell Radio</title>
   <link>http://www.example.com/radio/</link>
   <description>Description of this podcast</description>
   <item>First item</item>
   <item>Second item</item>
 </channel>

</rss> </syntaxhighlight>

The following content filter is constructed:

<syntaxhighlight lang="haskell"> channel :: CFilter channel = tag "rss" /> tag "channel" </syntaxhighlight>

This filter is later used to get the title of the channel:

<syntaxhighlight lang="haskell"> getTitle :: Content -> String getTitle doc = contentToStringDefault "Untitled Podcast" (channel /> tag "title" /> txt $ doc) </syntaxhighlight>

ReferencesEdit

Template:Reflist

External linksEdit

Template:Haskell programming