<?xml version='1.0' encoding='UTF-8'?>
<!--
 * 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.
-->
<!DOCTYPE s1 SYSTEM 'dtd/document.dtd'>
<s1 title='&ParserNameLong; Readme'>
  <s2 title='&ParserNameLong; &ParserVersion; Release'>
    <p>
      Welcome to the future! Xerces2 is the next generation of
      high performance, fully compliant XML parsers in the Apache
      Xerces family. This new version of Xerces introduces the
      Xerces Native Interface (XNI), a complete framework for
      building parser components and configurations that is
      extremely modular and easy to program. 
    </p>
    <p>
      The Apache Xerces2 parser is the reference implementation 
      of XNI but other parser components, configurations, and parsers
      can be written using the Xerces Native Interface. For complete
      design and implementation documents, refer to the 
      <link idref='xni'>XNI Manual</link>.
    </p>
    <p>
      Xerces2 is a fully conforming XML Schema 1.0 and 1.1 processor. An experimental implementation of the 
	  <jump href='http://www.w3.org/TR/2010/CR-xmlschema-ref-20100119/'>XML Schema Definition
	  Language (XSD): Component Designators</jump> (SCD) Candidate Recommendation (January 2010)	  
	  is also provided for evaluation. For more information, refer to the <link idref='xml-schema'>
	  XML Schema</link> page.
    </p>
    <p>
      Xerces2 also provides a <link idref='dom3'>complete implementation</link> of the 
<jump href="http://www.w3.org/DOM/DOMTR#dom3">Document 
      Object Model Level 3 Core and Load/Save</jump> W3C Recommendations and provides a 
      <link idref='faq-xinclude'>complete implementation</link> of the <jump href="http://www.w3.org/TR/2006/REC-xinclude-20061115/">XML Inclusions 
      (XInclude)</jump> W3C Recommendation. It also provides <link idref='faq-xcatalogs'>support</link>
      for <jump href="http://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html">OASIS XML Catalogs v1.1</jump>.
    </p>


    <p>Xerces2 is able to parse documents written according to the
        <jump href="http://www.w3.org/TR/2006/REC-xml11-20060816/">
        XML 1.1 Recommendation</jump>, except that 
        it does not yet provide an option to enable normalization checking as described
        in section 2.13 of this specification.
        It also handles namespaces according to the 
        <jump href="http://www.w3.org/TR/2006/REC-xml-names11-20060816/">
        XML Namespaces 1.1 Recommendation</jump>,
        and will correctly serialize XML 1.1 documents if the DOM level
        3 load/save APIs are in use.
    </p>

  </s2>
  <s2 title='Features of This Release'>
    <p>
      The &ParserNameLong; &ParserVersion; supports the
      following standards and APIs:
    </p>
    <ul>
      <li>
	<jump href='http://www.w3.org/XML/'>eXtensible Markup Language</jump>
	(XML) 1.0 
	<jump href='http://www.w3.org/TR/2006/REC-xml-20060816/'>Fourth 
	  Edition</jump> Recommendation
      </li>
      <li>
	   <jump href='http://www.w3.org/TR/2006/REC-xml-names-20060816/'>Namespaces in XML 1.0</jump>
	   Second Edition Recommendation
      </li>
      <li>
	<jump href='http://www.w3.org/XML/'>eXtensible Markup Language</jump>
	(XML) 1.1 
	<jump href='http://www.w3.org/TR/2006/REC-xml11-20060816/'>Second 
	  Edition</jump> Recommendation
      </li>
      <li>
        <jump href='http://www.w3.org/TR/2006/REC-xml-names11-20060816/'>Namespaces in XML 1.1</jump>
        Second Edition Recommendation
      </li>
      <li>
        <jump href='http://www.w3.org/TR/2006/REC-xinclude-20061115/'>
          XML Inclusions (XInclude) Version 1.0</jump> Second Edition Recommendation
      </li>
      <li>
	<jump href='http://www.w3.org/DOM/'>Document Object Model</jump>
	(DOM) Level 3
	<jump href='http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/'>Core</jump>,
	<jump href='http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/'>Load and Save</jump>,
	(DOM) Level 2
	<jump href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/'>Core</jump>,
	<jump href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/'>Events</jump>,
	and
	<jump href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/'>Traversal
	  and Range</jump> Recommendations
      </li>
      <li>
    <jump href='http://www.w3.org/TR/2008/REC-ElementTraversal-20081222/'>Element Traversal</jump>
      First Edition Recommendation
      </li>
      <li>
	<jump href='http://sax.sourceforge.net/'>Simple API for XML</jump> (SAX) 2.0.2 Core and Extensions
      </li>
      <li>
	<jump href='http://www.jcp.org/en/jsr/summary?id=206'>Java APIs for 
	  XML Processing</jump> (JAXP) 1.4
      </li>
      <li>
    <jump href='http://www.jcp.org/en/jsr/summary?id=173'>Streaming API For XML</jump> (StAX) 1.0 
    Event API (javax.xml.stream.events)
      </li>
      <li>
	<jump href='http://www.w3.org/XML/Schema'>XML Schema</jump> 1.0
	<jump href='http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/'>Structures</jump>
	and
	<jump href='http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/'>Datatypes</jump>
	Second Edition Recommendations
      </li>
      <li>
	<jump href='http://www.w3.org/XML/Schema'>XML Schema</jump> 1.1
	<jump href='http://www.w3.org/TR/2012/REC-xmlschema11-1-20120405/'>Structures</jump>
	and
	<jump href='http://www.w3.org/TR/2012/REC-xmlschema11-2-20120405/'>Datatypes</jump> Recommendations
      </li>   
      <li>
    <jump href='http://www.w3.org/TR/2010/CR-xmlschema-ref-20100119/'>XML Schema Definition Language 
    (XSD): Component Designators</jump> (SCD) Candidate Recommendation (January 2010)
      </li>   
    </ul>
  </s2>
  
  <s2 title='Backwards compatibility'>
    <p> According to the DOM Level 3 specification and 
      <jump href="http://www.w3.org/2000/11/DOM-Level-2-errata#core-26">DOM Level 2 errata
      </jump> the createElementNS and createAttributeNS methods convert empty string 
      namespaceURI to null. 
      Please, let us know if this change affects your application.</p>
  </s2>
  
  <s2 title='Changes from Previous Release'>

    <p>
      The &ParserNameLong; &ParserVersion; expands on its experimental support for XML Schema 1.1
      by providing fully compliant XML Schema 1.1 implementation. It fixes several bugs which
      were present in the previous release and also includes a few other minor enhancements.
    </p>
    <p>
      For a more complete list of changes, refer to the 
      <link idref='releases'>Release Information</link> page.
    </p>	      
  </s2>

  <s2 title='Changes from Xerces 1.x'>
    <p>
      Xerces2 is a nearly complete rewrite of the Xerces 1.x codebase
      in order to make the code cleaner, more modular, and easier to
      maintain. It includes a completely redesigned and rewritten XML Schema validation engine. 

      Applications using only the standard interfaces such as
      JAXP, DOM, and SAX should not see any differences. 
    </p>
  </s2>
  <s2 title='License Information'>
    <p>
      The &ParserName; &ParserVersion; release is available
      in source code and precompiled binary (JAR files) form. 
      Both &ParserName; packages are made available under the 
      <jump href='http://www.apache.org/licenses/LICENSE-2.0'>Apache Software
	License</jump>.
    </p>
  </s2>
</s1>
