<?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='JAXP Samples'>
 <s2 title='Overview'>
  <p>
   This page documents the various Java API for XML Processing (JAXP)
   samples included with Xerces. Besides being useful programs,
   they can be used as JAXP programming examples to learn how to
   program using the JAXP API.
  </p>
  <p>JAXP samples:</p>
  <ul>
   <li><link anchor='ParserAPIUsage'>jaxp.ParserAPIUsage</link></li>
   <li><link anchor='SourceValidator'>jaxp.SourceValidator</link></li>
   <li><link anchor='InlineSchemaValidator'>jaxp.InlineSchemaValidator</link></li>
   <li><link anchor='TypeInfoWriter'>jaxp.TypeInfoWriter</link></li>
   <li><link anchor='DatatypeAPIUsage'>jaxp.DatatypeAPIUsage</link></li>
  </ul>
 </s2>
 <anchor name='ParserAPIUsage'/>
 <s2 title='Sample jaxp.ParserAPIUsage'>
  <p>
   A sample which demonstrates usage of classes in the
   javax.xml.parsers package, particularly new features introduced
   in JAXP 1.3 and 1.4, including XInclude processing, integration 
   with the JAXP 1.4 Validation API and parser reset.
  </p>
  <s3 title='usage'>
   <source>java jaxp.ParserAPIUsage (options) uri</source>
  </s3>
  <s3 title='options'>
   <table>
    <tr><th>Option</th><th>Description</th></tr>
    <tr><td>-a uri ...</td><td>Provide a list of schema documents.</td></tr>
    <tr><td>-api (sax|dom)</td><td>Select API to use (sax|dom).</td></tr>
    <tr><td>-xi | -XI</td><td>Turn on/off XInclude processing.</td></tr>
    <tr><td>-sp | -SP</td><td>Turn on/off secure processing.</td></tr>
    <tr><td>-h</td><td>Display help screen.</td></tr>
   </table>
  </s3>
 </s2>
 <anchor name='SourceValidator'/>
 <s2 title='Sample jaxp.SourceValidator'>
  <p>
   A sample demonstrating how to use the JAXP 1.4 Validation API
   to create a validator and use the validator to validate input
   from SAX, DOM, StAX or a stream. The output of this program
   shows the time spent executing the Validator.validate(Source)
   method.
  </p>
  <p>
   This class is useful as a "poor-man's" performance tester to
   compare the speed of various JAXP 1.4 validators with different
   input sources. However, it is important to note that the first 
   validation time of a validator will include both VM class load time 
   and validator initialization that would not be present in subsequent
   validations with the same document. Also note that when the source for
   validation is SAX, StAX or a stream, the validation time will also 
   include the time to parse the document, whereas the DOM validation is
   completely in memory. 
  </p>
  <note>
   The results produced by this program should never be accepted 
   as true performance measurements.
  </note>
  <s3 title='usage'>
   <source>java jaxp.SourceValidator (options) ...</source>
  </s3>
  <s3 title='options'>
   <table>
    <tr><th>Option</th><th>Description</th></tr>
    <tr><td>-l name</td><td>Select schema language by name.</td></tr>
    <tr><td>-x number</td><td>Select number of repetitions.</td></tr>
    <tr><td>-a uri ...</td><td>Provide a list of schema documents.</td></tr>
    <tr><td>-i uri ...</td><td>Provide a list of instance documents to validate.</td></tr>
    <tr><td>-vs source</td><td>Select validation source (sax|dom|stax|stream).</td></tr>
    <tr>
     <td>-f  | -F</td>
     <td>
      Turn on/off Schema full checking.<br/>
      <strong>NOTE:</strong> Not supported by all schema factories and validators.
     </td>
    </tr>
    <tr>
     <td>-hs | -HS</td>
     <td>
      Turn on/off honouring of all schema locations.<br/>
      <strong>NOTE:</strong> Not supported by all schema factories and validators.
     </td>
    </tr>
    <tr>
     <td>-va | -VA</td>
     <td>
      Turn on/off validation of schema annotations.<br/>
      <strong>NOTE:</strong> Not supported by all schema factories and validators.
     </td>
    </tr>
    <tr>
     <td>-ga | -GA</td>
     <td>
      Turn on/off generation of synthetic schema annotations.<br/>
      <strong>NOTE:</strong> Not supported by all schema factories and validators.
     </td>
    </tr>
    <tr><td>-m  | -M</td><td>Turn on/off memory usage report.</td></tr>
    <tr><td>-h</td><td>Display help screen.</td></tr>
   </table>
  </s3>
  <s3 title='notes'>
   <p>
    The speed and memory results from this program should NOT be 
    used as the basis of parser performance comparison! Real 
    analytical methods should be used. For better results, perform
    multiple validations within the same virtual machine to 
    remove class loading from parse time and memory usage.
   </p>
   <p>
    Not all features are supported by different parsers.
   </p>
  </s3>
 </s2>
 <anchor name='InlineSchemaValidator'/>
 <s2 title='Sample jaxp.InlineSchemaValidator'>
  <p>
   A sample demonstrating how to use the JAXP 1.4 Validation API
   to create a validator and use the validator to validate input
   from a DOM which contains inline schemas and multiple validation
   roots. The output of this program shows the time spent executing 
   the Validator.validate(Source) method.
  </p>
  <p>
   This class is useful as a "poor-man's" performance tester to
   compare the speed of various JAXP 1.4 validators with different
   input sources. However, it is important to note that the first 
   validation time of a validator will include both VM class load time 
   and validator initialization that would not be present in subsequent
   validations with the same document.
  </p>
  <note>
   This sample makes use of the JAXP 1.3 XPath API and requires either
   a JAXP 1.3 compliant XSLT processor (or JDK 5.0) to run.
  </note>
  <note>
   The results produced by this program should never be accepted 
   as true performance measurements.
  </note>
  <s3 title='usage'>
   <source>java jaxp.InlineSchemaValidator (options) uri ...</source>
  </s3>
  <s3 title='options'>
   <table>
    <tr><th>Option</th><th>Description</th></tr>
    <tr><td>-l name</td><td>Select schema language by name.</td></tr>
    <tr><td>-x number</td><td>Select number of repetitions.</td></tr>
    <tr><td>-a xpath ...</td><td>Provide a list of XPath expressions for schema roots.</td></tr>
    <tr><td>-i xpath ...</td><td>Provide a list of XPath expressions for validation roots.</td></tr>
    <tr><td>-nm pre uri ...</td><td>Provide a list of prefix to namespace URI mappings for the XPath expressions.</td></tr>
    <tr>
     <td>-f  | -F</td>
     <td>
      Turn on/off Schema full checking.<br/>
      <strong>NOTE:</strong> Not supported by all schema factories and validators.
     </td>
    </tr>
    <tr>
     <td>-hs | -HS</td>
     <td>
      Turn on/off honouring of all schema locations.<br/>
      <strong>NOTE:</strong> Not supported by all schema factories and validators.
     </td>
    </tr>
    <tr>
     <td>-va | -VA</td>
     <td>
      Turn on/off validation of schema annotations.<br/>
      <strong>NOTE:</strong> Not supported by all schema factories and validators.
     </td>
    </tr>
    <tr>
     <td>-ga | -GA</td>
     <td>
      Turn on/off generation of synthetic schema annotations.<br/>
      <strong>NOTE:</strong> Not supported by all schema factories and validators.
     </td>
    </tr>
    <tr><td>-m  | -M</td><td>Turn on/off memory usage report.</td></tr>
    <tr><td>-h</td><td>Display help screen.</td></tr>
   </table>
  </s3>
  <s3 title='notes'>
   <p>
    The speed and memory results from this program should NOT be 
    used as the basis of parser performance comparison! Real 
    analytical methods should be used. For better results, perform
    multiple validations within the same virtual machine to 
    remove class loading from parse time and memory usage.
   </p>
   <p>
    Not all features are supported by different parsers.
   </p>
  </s3>
 </s2>
 <anchor name='TypeInfoWriter'/>
 <s2 title='Sample jaxp.TypeInfoWriter'>
  <p>
   Provides a trace of the schema type information for elements and
   attributes in an XML document. This demonstrates usage of the
   JAXP 1.4 Validation API, particuarly how to read type information
   from a TypeInfoProvider.
  </p>
  <s3 title='usage'>
   <source>java jaxp.TypeInfoWriter (options) ...</source>
  </s3>
  <s3 title='options'>
   <table>
    <tr><th>Option</th><th>Description</th></tr>
    <tr><td>-l name</td><td>Select schema language by name.</td></tr>
    <tr><td>-p name</td><td>Select parser by name.</td></tr>
    <tr><td>-a uri ...</td><td>Provide a list of schema documents.</td></tr>
    <tr><td>-i uri ...</td><td>Provide a list of instance documents to validate.</td></tr>
    <tr>
     <td>-f  | -F</td>
     <td>
      Turn on/off Schema full checking.<br/>
      <strong>NOTE:</strong> Not supported by all schema factories and validators.
     </td>
    </tr>
    <tr>
     <td>-hs | -HS</td>
     <td>
      Turn on/off honouring of all schema locations.<br/>
      <strong>NOTE:</strong> Not supported by all schema factories and validators.
     </td>
    </tr>
    <tr>
     <td>-va | -VA</td>
     <td>
      Turn on/off validation of schema annotations.<br/>
      <strong>NOTE:</strong> Not supported by all schema factories and validators.
     </td>
    </tr>
    <tr>
     <td>-ga | -GA</td>
     <td>
      Turn on/off generation of synthetic schema annotations.<br/>
      <strong>NOTE:</strong> Not supported by all schema factories and validators.
     </td>
    </tr>
    <tr><td>-h</td><td>Display help screen.</td></tr>
   </table>
  </s3>
 </s2>
 <anchor name='DatatypeAPIUsage'/>
 <s2 title='Sample jaxp.DatatypeAPIUsage'>
  <p>
   A sample which demonstrates usage of the JAXP 1.3 Datatype API.
  </p>
  <s3 title='usage'>
   <source>java jaxp.DatatypeAPIUsage</source>
  </s3>
 </s2>
</s1>
