README.md

# Xmlx

Xmlx is a XML parser that enables search using attribute or element names.

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed as:

  1. Add `xmlx` to your list of dependencies in `mix.exs`:

    ```elixir
    def deps do
      [{:xmlx, "~> 0.0.1"}]
    end
    ```

  2. Ensure `xmlx` is started before your application:

    ```elixir
    def application do
      [applications: [:xmlx]]
    end
    ```

## Usage

### XML Example (simple.xml)
  ```xml
<?xml version="1.0" encoding="UTF-8"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>
  ```

  1. Document parse
    ```elixir
    File.read!("simple.xml") |> Xmlx.parse()
    ```
    ```
[note: [to: [text: "Tove"], from: [text: "Jani"], heading: [text: "Reminder"],
  body: [text: "Don't forget me this weekend!"]]]
    ```

  2. Find element/attribute
    ```elixir
    File.read!("simple.xml") |> Xmlx.parse() |> Xmlx.find(:from)
    ```
    ```
[from: [text: "Jani"]]
    ```

### WSDL Example (simple.wsdl)
  ```xml
<?xml version="1.0"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.examples.com/wsdl/HelloService.wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloService" targetNamespace="http://www.examples.com/wsdl/HelloService.wsdl">
  <message name="SayHelloRequest">
    <part name="firstName" type="xsd:string"/>
  </message>
  <message name="SayHelloResponse">
    <part name="greeting" type="xsd:string"/>
  </message>
  <portType name="Hello_PortType">
    <operation name="sayHello">
      <input message="tns:SayHelloRequest"/>
      <output message="tns:SayHelloResponse"/>
    </operation>
  </portType>
  <binding name="Hello_Binding" type="tns:Hello_PortType">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="sayHello">
      <soap:operation soapAction="sayHello"/>
      <input>
        <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:examples:helloservice" use="encoded"/>
      </input>
      <output>
        <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:examples:helloservice" use="encoded"/>
      </output>
    </operation>
  </binding>
  <service name="Hello_Service">
    <documentation>WSDL File for HelloService</documentation>
    <port binding="tns:Hello_Binding" name="Hello_Port">
      <soap:address location="http://www.examples.com/SayHello/"/>
    </port>
  </service>
</definitions>
  ```

  1. Document parse
    ```elixir
    File.read!("simple.wsdl") |> Xmlx.parse()
    ```
    ```
[definitions: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
  __attrs__: [name: "HelloService",
   targetNamespace: "http://www.examples.com/wsdl/HelloService.wsdl"],
  message: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
   __attrs__: [name: "SayHelloRequest"],
   part: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
    __attrs__: [name: "firstName", type: "xsd:string"]]],
  message: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
   __attrs__: [name: "SayHelloResponse"],
   part: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
    __attrs__: [name: "greeting", type: "xsd:string"]]],
  portType: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
   __attrs__: [name: "Hello_PortType"],
   operation: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
    __attrs__: [name: "sayHello"],
    input: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
     __attrs__: [message: "tns:SayHelloRequest"]],
    output: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
     __attrs__: [message: "tns:SayHelloResponse"]]]],
  binding: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
   __attrs__: [name: "Hello_Binding", type: "tns:Hello_PortType"],
   binding: [__namespace__: "http://schemas.xmlsoap.org/wsdl/soap/",
    __attrs__: [style: "rpc",
     transport: "http://schemas.xmlsoap.org/soap/http"]],
   operation: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
    __attrs__: [name: "sayHello"],
    operation: [__namespace__: "http://schemas.xmlsoap.org/wsdl/soap/",
     __attrs__: [soapAction: "sayHello"]],
    input: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
     body: [__namespace__: "http://schemas.xmlsoap.org/wsdl/soap/",
      __attrs__: [encodingStyle: "http://schemas.xmlsoap.org/soap/encoding/",
       namespace: "urn:examples:helloservice", use: "encoded"]]],
    output: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
     body: [__namespace__: "http://schemas.xmlsoap.org/wsdl/soap/",
      __attrs__: [encodingStyle: "http://schemas.xmlsoap.org/soap/encoding/",
       namespace: "urn:examples:helloservice", use: "encoded"]]]]],
  service: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
   __attrs__: [name: "Hello_Service"],
   documentation: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
    text: "WSDL File for HelloService"],
   port: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
    __attrs__: [binding: "tns:Hello_Binding", name: "Hello_Port"],
    address: [__namespace__: "http://schemas.xmlsoap.org/wsdl/soap/",
     __attrs__: [location: "http://www.examples.com/SayHello/"]]]]]]
    ```

  2. Find element/attribute
    ```elixir
    File.read!("simple.wsdl") |> Xmlx.parse() |> Xmlx.find(:port)
    ```
    ```
[port: [__namespace__: "http://schemas.xmlsoap.org/wsdl/",
  __attrs__: [binding: "tns:Hello_Binding", name: "Hello_Port"],
  address: [__namespace__: "http://schemas.xmlsoap.org/wsdl/soap/",
   __attrs__: [location: "http://www.examples.com/SayHello/"]]]]
    ```