<?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='DOM Samples'>
 <s2 title='Overview'>
  <p>
   This page documents the various Document Object Model (DOM)
   samples included with Xerces. Besides being useful programs,
   they can be used as DOM programming examples to learn how to
   program using the DOM API.
  </p>
  <p>Basic DOM samples:</p>
  <ul>
   <li><link anchor='Counter'>dom.Counter</link></li>
   <!--
     - Should the following samples be removed? rewritten? revamped?
   <li><link anchor='DOMGenerate'>dom.DOMGenerate</link></li>
   -->
   <li><link anchor='GetElementsByTagName'>dom.GetElementsByTagName</link></li>
   <li><link anchor='Writer'>dom.Writer</link></li>
   <!-- <li><link anchor='ASBuilder'>dom.ASBuilder</link></li> -->
   <li><link anchor='ElementPrinter'>dom.ElementPrinter</link></li>
   <li><link anchor='DOM3'>dom.DOM3</link></li>
   <li><link anchor='DOMAddLines'>dom.DOMAddLines</link></li>
  </ul>
  <!--
    - These samples should be redone.
  <p>DOM Traversal samples:</p>
  <ul>
   <li><link anchor='IteratorView'>dom.traversal.IteratorView</link></li>
   <li><link anchor='NameNodeFilter'>dom.traversal.NameNodeFilter</link></li>
   <li><link anchor='TreeWalkerView'>dom.traversal.TreeWalkerView</link></li>
  </ul>
  -->
  <p>
   Most of the DOM parser samples have a command line option that
   allows the user to specify a different DOM parser to use. In
   order to supply another DOM parser besides the default Xerces
   <code>DOMParser</code>, a DOM parser wrapper class must be written.
   This class must implement the <code>dom.ParserWrapper</code>
   interface.
  </p>
  <note>
   JAXP could be used instead of the special DOM parser wrapper
   class. However, that feature is not implemented at this time.
   Using JAXP would require the user to specify the
   <code>-Djavax.xml.parsers.DocumentBuilderFactory=...</code>
   option to the virtual machine in order to use a different
   document builder factory.
  </note>
 </s2>
 <anchor name='Counter'/>
 <s2 title='Sample dom.Counter'>
  <p>
   A sample DOM counter. This sample program illustrates how to
   traverse a DOM tree in order to get information about the document.
   The output of this program shows the time and count of elements,
   attributes, ignorable whitespaces, and characters appearing in
   the document. Three times are shown: the parse time, the first
   traversal of the document, and the second traversal of the tree.
  </p>
  <p>
   This class is useful as a "poor-man's" performance tester to
   compare the speed and accuracy of various DOM parsers. However,
   it is important to note that the first parse time of a parser
   will include both VM class load time and parser initialization
   that would not be present in subsequent parses with the same
   file. 
  </p>
  <note>
   The results produced by this program should never be accepted as
   true performance measurements.
  </note>
  <s3 title='usage'>
   <source>java dom.Counter (options) uri ...</source>
  </s3>
  <s3 title='options'>
   <table>
    <tr><th>Option</th><th>Description</th></tr>
    <tr><td>-p name</td><td>Select parser wrapper by name.</td></tr>
    <tr><td>-x number</td><td>Select number of repetitions.</td></tr>
    <tr><td>-n  | -N</td><td>Turn on/off namespace processing.</td></tr>
    <tr><td>-v  | -V</td><td>Turn on/off validation.</td></tr>
    <tr>
     <td>-s  | -S</td>
     <td>
      Turn on/off Schema validation support.<br/>
      <strong>NOTE:</strong> Not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-f  | -F</td>
     <td>
      Turn on/off Schema full checking.<br/>
      <strong>NOTE:</strong> Requires use of -s and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-hs | -HS</td>
     <td>
      Turn on/off honouring of all schema locations.<br/>
      <strong>NOTE:</strong> Requires use of -s and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-va | -VA</td>
     <td>
      Turn on/off validation of schema annotations.<br/>
      <strong>NOTE:</strong> Requires use of -s and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-dv | -DV</td>
     <td>
      Turn on/off dynamic validation.<br/>
      <strong>NOTE:</strong> Not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-xi | -XI</td>
     <td>
      Turn on/off XInclude processing.<br/>
      <strong>NOTE:</strong> Not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-xb | -XB</td>
     <td>
      Turn on/off base URI fixup during XInclude processing.<br/>
      <strong>NOTE:</strong> Requires use of -xi and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-xl | -XL</td>
     <td>
      Turn on/off language fixup during XInclude processing.<br/>
      <strong>NOTE:</strong> Requires use of -xi and not supported by all parsers.
     </td>
    </tr>
    <tr><td>-h</td><td>Display help screen.</td></tr>
   </table>
  </s3>
 </s2>
 <!--
   - Should the following samples be removed? rewritten? revamped?
 <anchor name='DOMGenerate'/>
 <s2 title='Sample dom.DOMGenerate'>
  <p>TODO</p>
 </s2>
 -->
 <anchor name='GetElementsByTagName'/>
 <s2 title='Sample dom.GetElementsByTagName'>
  <p>
   A sample DOM filter. This sample program illustrates how to
   use the <code>Document#getElementsByTagName()</code> method 
   to quickly and easily locate elements by name.
  </p>
  <s3 title='usage'>
   <source>java dom.GetElementsByTagName (options) uri ...</source>
  </s3>
  <s3 title='options'>
   <table>
    <tr><th>Option</th><th>Description</th></tr>
    <tr><td>-p name</td><td>Select parser wrapper by name.</td></tr>
    <tr><td>-e name</td><td>Specify element name for search.</td></tr>
    <tr><td>-a name</td><td>Specify attribute name for specified elements.</td></tr>
    <tr><td>-n | -N</td><td>Turn on/off namespace processing.</td></tr>
    <tr><td>-v | -V</td><td>Turn on/off validation.</td></tr>
    <tr>
     <td>-s | -S</td>
     <td>
      Turn on/off Schema validation support.<br/>
     <strong>NOTE:</strong> Not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-f  | -F</td>
     <td>
      Turn on/off Schema full checking.<br/>
      <strong>NOTE:</strong> Requires use of -s and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-hs | -HS</td>
     <td>
      Turn on/off honouring of all schema locations.<br/>
      <strong>NOTE:</strong> Requires use of -s and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-va | -VA</td>
     <td>
      Turn on/off validation of schema annotations.<br/>
      <strong>NOTE:</strong> Requires use of -s and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-dv | -DV</td>
     <td>
      Turn on/off dynamic validation.<br/>
      <strong>NOTE:</strong> Not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-xi | -XI</td>
     <td>
      Turn on/off XInclude processing.<br/>
      <strong>NOTE:</strong> Not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-xb | -XB</td>
     <td>
      Turn on/off base URI fixup during XInclude processing.<br/>
      <strong>NOTE:</strong> Requires use of -xi and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-xl | -XL</td>
     <td>
      Turn on/off language fixup during XInclude processing.<br/>
      <strong>NOTE:</strong> Requires use of -xi and not supported by all parsers.
     </td>
    </tr>
    <tr><td>-h</td><td>Display help screen.</td></tr>
   </table>
  </s3>
 </s2>
 <anchor name='Writer'/>
 <s2 title='Sample dom.Writer'>
  <p>
   A sample DOM writer. This sample program illustrates how to
   traverse a DOM tree in order to print a document that is parsed.
  </p>
  <s3 title='usage'>
   <source>java dom.Writer (options) uri ...</source>
  </s3>
  <s3 title='options'>
   <table>
    <tr><td>-p name</td><td>Select parser wrapper by name.</td></tr>
    <tr><td>-n | -N</td><td>Turn on/off namespace processing.</td></tr>
    <tr><td>-v | -V</td><td>Turn on/off validation.</td></tr>
    <tr>
     <td>-xd | -XD</td>
     <td>
      Turn on/off loading of external DTDs.<br/>
      <strong>NOTE:</strong> Always on when -v in use and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-s | -S</td>
     <td>
      Turn on/off Schema validation support.<br/>
      <strong>NOTE:</strong> Not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-f  | -F</td>
     <td>
      Turn on/off Schema full checking.<br/>
      <strong>NOTE:</strong> Requires use of -s and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-hs | -HS</td>
     <td>
      Turn on/off honouring of all schema locations.<br/>
      <strong>NOTE:</strong> Requires use of -s and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-va | -VA</td>
     <td>
      Turn on/off validation of schema annotations.<br/>
      <strong>NOTE:</strong> Requires use of -s and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-ga | -GA</td>
     <td>
      Turn on/off generation of synthetic schema annotations.<br/>
      <strong>NOTE:</strong> Requires use of -s and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-dv | -DV</td>
     <td>
      Turn on/off dynamic validation.<br/>
      <strong>NOTE:</strong> Not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-xi | -XI</td>
     <td>
      Turn on/off XInclude processing.<br/>
      <strong>NOTE:</strong> Not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-xb | -XB</td>
     <td>
      Turn on/off base URI fixup during XInclude processing.<br/>
      <strong>NOTE:</strong> Requires use of -xi and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-xl | -XL</td>
     <td>
      Turn on/off language fixup during XInclude processing.<br/>
      <strong>NOTE:</strong> Requires use of -xi and not supported by all parsers.
     </td>
    </tr>
    <tr>
     <td>-c | -C</td>
     <td>
      Turn on/off Canonical XML output.<br/>
      <strong>NOTE:</strong> This is not W3C canonical output.
     </td>
    </tr>
    <tr><td>-h</td><td>Display help screen.</td></tr>
   </table>
  </s3>
 </s2>

<!--
 <anchor name='ASBuilder'/>
 <s2 title='Sample dom.ASBuilder'>
  <p>
   This sample program illustrates how to preparse xml schema
   documents and how to validate instance documents against
   preparsed schema grammars.
  </p>
  <note>The Abstract Schema module implementation is <code>deprecated</code>. You should use 
        Xerces Grammar caching functionality to pre-parse schemas.</note>
  <s3 title='usage'>
   <source>java dom.ASBuilder [-f|-F] -a uri ... [-i uri ...]</source>
  </s3>
  <s3 title='options'>
   <table>
    <tr><td>-f | -F</td><td>Turn on/off schema full checking.</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>
   </table>
  </s3>
 </s2> -->

 <anchor name='ElementPrinter'/>
 <s2 title='Sample dom.ElementPrinter'>
  <p>This sample program illustrates how to use the org.w3c.dom.ElementTraversal API.</p>

  <s3 title='usage'>
   <source>java dom.ElementPrinter uri</source>
  </s3>
 </s2>

 <anchor name='DOM3'/>
 <s2 title='Sample dom.DOM3'>
  <p>This sample program illustrates how to use the DOM Level 3 API.</p>

  <s3 title='usage'>
   <source>java dom.DOM3 uri</source>
  </s3>
 </s2>

 <anchor name='DOMAddLines'/>
 <s2 title='Sample dom.DOMAddLines'>
  <p>
    A sample of Adding lines to the DOM Node. This sample program illustrates:
  </p>
  <ul>
    <li>How to override methods from  DocumentHandler ( XMLDocumentHandler)</li>
    <li>How to turn off ignorable white spaces by overriding ignorableWhiteSpace</li>
    <li>How to use the SAX Locator to return row position (line number of DOM element)</li>
    <li>How to attach user defined Objects to Nodes using the DOM Level 3 setUserData method.</li>
  </ul>
 <s3 title='usage'>
   <source>java dom.DOMAddLines (options) uri ...</source>
  </s3>
  <s3 title='options'>
   <table>
    <tr><th>Option</th><th>Description</th></tr>
    <tr><td>-h</td><td>Display help screen.</td></tr>
    <tr><td>-i</td><td>Don't print ignorable white spaces.</td></tr>
   </table>
  </s3>
 </s2>
 <!--
    These samples should be redone.
 <anchor name='IteratorView'/>
 <s2 title='Sample dom.traversal.IteratorView'>
  <p>TODO</p>
 </s2>
 <anchor name='NameNodeFilter'/>
 <s2 title='Sample dom.traversal.NameNodeFilter'>
  <p>TODO</p>
 </s2>
 <anchor name='TreeWalkerView'/>
 <s2 title='Sample dom.traversal.TreeWalkerView'>
  <p>TODO</p>
 </s2>
 -->
</s1>
