ymtszw/elm-xml-decode/1.0.0

NOTE: this package is not compatible with Elm 0.19.1

elm-xml-decode

Build Status

XML decoder, sharing the spirit of Json.Decode.

Using jinjor/elm-xml-parser as its parser component.

eeue56/elm-xml is an existing full-package XML parser/decoder for Elm, though I intend to provide an alternative XML decoder which exhibits following properties:

  • Provides Decoder-based APIs, sharing the spirit of Json.Decode
  • Also provides DSL-styled decoder compositions, as in Xml.Decode.Pipeline, Xml.Decode.Extra
  • Handles list of XML node with identical tags, using ListDecoder type
  • Locates targeting XML nodes using "path" of tags, partially mimicking XPath

Examples

Basics:

import Xml.Decode exposing (Decoder, map2, path, single, list, string, int)


type alias Example =
    { string : String
    , integers : List Int
    }


exampleDecoder : Decoder Example
exampleDecoder =
    map2 Example
        (path [ "path", "to", "string", "value" ] (single string))
        (path [ "path", "to", "int", "values" ] (list int))

Execute decode:

Xml.Decode.run exampleDecoder
    """
    <root>
        <path>
            <to>
                <string>
                    <value>SomeString</value>
                </string>
                <int>
                    <values>1</values>
                    <values>2</values>
                </int>
            </to>
        </path>
    </root>
    """
--> Ok { string = "SomeString", integers = [ 1, 2 ] } : Example

Decoder compositions

We have map, map2 and variants, though the following methods are also possible.

Pipeline style!:

import Xml.Decode exposing (Decoder, succeed, single, list, string, int)
import Xml.Decode.Pipeline exposing (requiredPath)


exampleDecoder : Decoder Example
exampleDecoder =
    succeed Example
        |> requiredPath [ "path", "to", "string", "value" ] (single string)
        |> requiredPath [ "path", "to", "int", "values" ] (list int)

Applicative style!:

import Xml.Decode exposing (Decoder, succeed, path, single, list, string, int)
import Xml.Decode.Extra exposing ((|:))

exampleDecoder : Decoder Example
exampleDecoder =
    succeed Example
        |: path [ "path", "to", "string", "value" ] (single string)
        |: path [ "path", "to", "int", "values" ] (list int)

Development

npm install
npm test
npm run watch:test # Monitor file changes and update doc-test
npm run docs       # Compile and generate docs.json
npm run analyse    # Analyse Elm code

Are they efficient? Are they fast?

Benchmark and refinements/optimizations would be cool... though I haven't committed to them. Help, help me!

License

BSD-3-Clause