/xmlx

Elixir native XML parser that enables search by attribute or element names

Primary LanguageElixirDo What The F*ck You Want To Public LicenseWTFPL

Xmlx

ci workflow coverage status hex.pm version hex.pm downloads hex.pm license

Elixir native XML parser that enables search using attribute or element names

Installation

The package can be installed by adding xmlx to your list of dependencies in mix.exs:

def deps do
  [{:xmlx, "~> 0.1.1"}]
end

Usage

XML Example (simple.xml)

<?xml version="1.0" encoding="UTF-8"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body type="text">Don't forget me this weekend!</body>
</note>
  1. Document parse

    File.read!("simple.xml")
    |> Xmlx.parse()
    [
      note: [
        to: [text: "Tove"],
        from: [text: "Jani"],
        heading: [text: "Reminder"],
        body: ["@type": "text", text: "Don't forget me this weekend!"]
      ]
    ]
  2. Find by element name

    File.read!("simple.xml")
    |> Xmlx.parse()
    |> Xmlx.find(:from)

    or

    File.read!("simple.xml")
    |> Xmlx.parse()
    |> Xmlx.find("from")

    result

    [from: [text: "Jani"]]
  3. Find by attribute name

    File.read!("simple.xml")
    |> Xmlx.parse()
    |> Xmlx.find(:"@type")

    or

    File.read!("simple.xml")
    |> Xmlx.parse()
    |> Xmlx.find("@type")

    result

    ["@type": "text"]

WSDL Example (simple.wsdl)

<?xml version="1.0"?>
<definitions name="EndorsementSearch"
  targetNamespace="http://namespaces.snowboard-info.com"
  xmlns:es="http://www.snowboard-info.com/EndorsementSearch.wsdl"
  xmlns:esxsd="http://schemas.snowboard-info.com/EndorsementSearch.xsd"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns="http://schemas.xmlsoap.org/wsdl/"
>

  <!-- omitted types section with content model schema info -->

  <message name="GetEndorsingBoarderRequest">
    <part name="body" element="esxsd:GetEndorsingBoarder"/>
  </message>

  <message name="GetEndorsingBoarderResponse">
    <part name="body" element="esxsd:GetEndorsingBoarderResponse"/>
  </message>

  <portType name="GetEndorsingBoarderPortType">
    <operation name="GetEndorsingBoarder">
      <input message="es:GetEndorsingBoarderRequest"/>
      <output message="es:GetEndorsingBoarderResponse"/>
      <fault message="es:GetEndorsingBoarderFault"/>
    </operation>
  </portType>

  <binding name="EndorsementSearchSoapBinding"
           type="es:GetEndorsingBoarderPortType">
    <soap:binding style="document"
                  transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="GetEndorsingBoarder">
      <soap:operation
        soapAction="http://www.snowboard-info.com/EndorsementSearch"/>
      <input>
        <soap:body use="literal"
          namespace="http://schemas.snowboard-info.com/EndorsementSearch.xsd"/>
      </input>
      <output>
        <soap:body use="literal"
          namespace="http://schemas.snowboard-info.com/EndorsementSearch.xsd"/>
      </output>
      <fault>
        <soap:body use="literal"
          namespace="http://schemas.snowboard-info.com/EndorsementSearch.xsd"/>
      </fault>
    </operation>
  </binding>

  <service name="EndorsementSearchService">
    <documentation>snowboarding-info.com Endorsement Service</documentation>
    <port name="GetEndorsingBoarderPort"
          binding="es:EndorsementSearchSoapBinding">
      <soap:address location="http://www.snowboard-info.com/EndorsementSearch"/>
    </port>
  </service>

</definitions>
  1. Document parse

    File.read!("simple.wsdl")
    |> Xmlx.parse()
    [
      "{http://schemas.xmlsoap.org/wsdl/}definitions": [
        "@name": "EndorsementSearch",
        "@targetNamespace": "http://namespaces.snowboard-info.com",
        "{http://schemas.xmlsoap.org/wsdl/}message": [
          "@name": "GetEndorsingBoarderRequest",
          "{http://schemas.xmlsoap.org/wsdl/}part": [
            "@name": "body",
            "@element": "esxsd:GetEndorsingBoarder"
          ]
        ],
        "{http://schemas.xmlsoap.org/wsdl/}message": [
          "@name": "GetEndorsingBoarderResponse",
          "{http://schemas.xmlsoap.org/wsdl/}part": [
            "@name": "body",
            "@element": "esxsd:GetEndorsingBoarderResponse"
          ]
        ],
        "{http://schemas.xmlsoap.org/wsdl/}portType": [
          "@name": "GetEndorsingBoarderPortType",
          "{http://schemas.xmlsoap.org/wsdl/}operation": [
            "@name": "GetEndorsingBoarder",
            "{http://schemas.xmlsoap.org/wsdl/}input": [
              "@message": "es:GetEndorsingBoarderRequest"
            ],
            "{http://schemas.xmlsoap.org/wsdl/}output": [
              "@message": "es:GetEndorsingBoarderResponse"
            ],
            "{http://schemas.xmlsoap.org/wsdl/}fault": [
              "@message": "es:GetEndorsingBoarderFault"
            ]
          ]
        ],
        "{http://schemas.xmlsoap.org/wsdl/}binding": [
          "@name": "EndorsementSearchSoapBinding",
          "@type": "es:GetEndorsingBoarderPortType",
          "{http://schemas.xmlsoap.org/wsdl/soap/}binding": [
            "@style": "document",
            "@transport": "http://schemas.xmlsoap.org/soap/http"
          ],
          "{http://schemas.xmlsoap.org/wsdl/}operation": [
            "@name": "GetEndorsingBoarder",
            "{http://schemas.xmlsoap.org/wsdl/soap/}operation": [
              "@soapAction": "http://www.snowboard-info.com/EndorsementSearch"
            ],
            "{http://schemas.xmlsoap.org/wsdl/}input": [
              "{http://schemas.xmlsoap.org/wsdl/soap/}body": [
                "@use": "literal",
                "@namespace": "http://schemas.snowboard-info.com/EndorsementSearch.xsd"
              ]
            ],
            "{http://schemas.xmlsoap.org/wsdl/}output": [
              "{http://schemas.xmlsoap.org/wsdl/soap/}body": [
                "@use": "literal",
                "@namespace": "http://schemas.snowboard-info.com/EndorsementSearch.xsd"
              ]
            ],
            "{http://schemas.xmlsoap.org/wsdl/}fault": [
              "{http://schemas.xmlsoap.org/wsdl/soap/}body": [
                "@use": "literal",
                "@namespace": "http://schemas.snowboard-info.com/EndorsementSearch.xsd"
              ]
            ]
          ]
        ],
        "{http://schemas.xmlsoap.org/wsdl/}service": [
          "@name": "EndorsementSearchService",
          "{http://schemas.xmlsoap.org/wsdl/}documentation": [
            text: "snowboarding-info.com Endorsement Service"
          ],
          "{http://schemas.xmlsoap.org/wsdl/}port": [
            "@name": "GetEndorsingBoarderPort",
            "@binding": "es:EndorsementSearchSoapBinding",
            "{http://schemas.xmlsoap.org/wsdl/soap/}address": [
              "@location": "http://www.snowboard-info.com/EndorsementSearch"
            ]
          ]
        ]
      ]
    ]
  2. Find by element name

    File.read!("simple.wsdl")
    |> Xmlx.parse()
    |> Xmlx.find(:"{http://schemas.xmlsoap.org/wsdl/}port")

    or

    File.read!("simple.wsdl")
    |> Xmlx.parse()
    |> Xmlx.find("{http://schemas.xmlsoap.org/wsdl/}port")

    or

    File.read!("simple.wsdl")
    |> Xmlx.parse()
    |> Xmlx.find("port")

    result

    [
      "{http://schemas.xmlsoap.org/wsdl/}port": [
        "@name": "GetEndorsingBoarderPort",
        "@binding": "es:EndorsementSearchSoapBinding",
        "{http://schemas.xmlsoap.org/wsdl/soap/}address": [
          "@location": "http://www.snowboard-info.com/EndorsementSearch"
        ]
      ]
    ]
  3. Find by attribute name

    File.read!("simple.wsdl")
    |> Xmlx.parse()
    |> Xmlx.find(:"@location")

    or

    File.read!("simple.wsdl")
    |> Xmlx.parse()
    |> Xmlx.find("@location")

    result

    ["@location": "http://www.snowboard-info.com/EndorsementSearch"]