/elm-xml-decode

Elm XML decoder sharing the spirit of Json.Decode

Primary LanguageElmBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

elm-xml-decode

CircleCI

XML decoder, sharing the spirit of Json.Decode. Ready for Elm 0.19.

Using jinjor/elm-xml-parser as its parser component, which is based on elm/parser.

Related Works

eeue56/elm-xml was an existing full-package XML parser/decoder for Elm, though I intended 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, sharing the sprits of Json.Decode.Pipeline
  • 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 (..)

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

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

run dataDecoder
    """
    <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 ] }

Pipeline Decoder compositions

We have map, map2 and variants, though the Pipeline style is also possible:

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

Development

Globally install Elm Platform, elm-test, and elm-verify-examples

$ elm-test
$ elm-verify-examples
$ elm-verify-examples --elm-test=elm-test # Explicitly set elm-test to use, if particular elm-test version has some issues

Benchmark: Are they efficient? Are they fast?

Benchmark codes can be found in benchmarks/ directory. Using examples in W3School.

$ elm make Benchmarks.elm --optimize --output=../docs/index.html

Looking forward to see similar benchmarks from other related works!!

In Elm 0.19

Using elm-explorations/benchmark. Available here as a static web page.

It may hang for a while during JIT warming up, but keep waiting (~ a minute).

Sample result (on my desktop PC):

  • CPU: Core i7 8700K 3.7GHz
  • Mem: DDR4 32GB
  • Windows 10 (2019/01/13)
  • Google Chrome 71.0.3578.98 64bit

bench 3.0

In Elm 0.18 (elm-xml-decode 1.x)

Using BrianHicks/elm-benchmark.

Sample result (on my MacBookPro early 2015):

  • CPU: Core i5 2.7GHz
  • Mem: DDR3 8GB 1867MHz
  • macOS (was El Capitan era, IIRC)
  • Google Chrome 63.0.3239.84 64bit

bench 1.0

License

BSD-3-Clause