~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements. See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership. The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License. You may obtain a copy of the License at
~~
~~ http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied. See the License for the
~~ specific language governing permissions and limitations
~~ under the License.

           ------------
           Introduction
           ------------

Welcome to Apache Axiom

  The Apache Axiom\u2122 library provides an XML Infoset compliant object model
  implementation which supports on-demand building
  of the object tree. It supports a novel "pull-through" model which allows one to turn off the tree
  building and directly access the underlying pull event stream using the StAX API. It also has built in support for XML
  Optimized Packaging (XOP) and MTOM, the combination of which allows XML to carry binary data
  efficiently and in a transparent manner. The combination of these is an easy to use API with a very
  high performant architecture!

  Developed as part of Apache Axis2, Apache Axiom is the core of Apache Axis2. However, it is a pure
  standalone XML Infoset model with novel features and can be used independently of Apache Axis2.

  Apache Axiom, Axiom, Apache, the Apache feather logo, and the Apache Axiom project logo are
  trademarks of {{{http://apache.org/}The Apache Software Foundation}}.
  
Key Features

    * Full XML Infoset compliant XML object model

    * StAX based builders with on-demand building and pull-through

    * XOP/MTOM support offering direct binary support

    * Convenient SOAP Infoset API on top of Axiom

    * Two implementations included:

        * Linked list based implementation

        * W3C DOM supporting implementation

    * Highly performant
