<?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 faqs SYSTEM 'dtd/faqs.dtd'>
<faqs title='Programming with DOM'>

  <faq title="Concurrent access">
    <q>Is Xerces DOM implementation thread-safe?</q>
    <a> <p>No. DOM does not require implementations to be thread safe. 
	If you need to access the DOM from multiple threads, 
	you are required to add the appropriate locks
	to your application code. 
      </p>
    </a>
  </faq>
  <faq title='Creating a DOM Parser with JAXP and DOM Level 3'>
    <q>How do I create a DOM parser?</q>
    <a>
      <p>
	You can create a DOM parser by using  the Java APIs for
	XML Processing (JAXP) or using the DOM Level 3 Load and Save.
      </p>
      <p>  
	The following source code shows how to create the parser with JAXP:
      </p>
      <source>import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

...

String xmlFile = &quot;file:///&parserdir;/data/personal.xml&quot;; 
try {
    DocumentBuilderFactory factory = 
    DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(xmlFile);
}
catch (FactoryConfigurationError e) {
    // unable to get a document builder factory
} 
catch (ParserConfigurationException e) {
    // parser was unable to be configured
catch (SAXException e) {
    // parsing error
} 
catch (IOException e) {
    // i/o error
}</source>
      <anchor name="domparser"/>
      <p>  
	The following source code shows how to create the parser using <jump href="http://www.w3.org/DOM/DOMTR#DOML3">DOM Level 3</jump>:
      </p>
      <source>import  org.w3c.dom.bootstrap.DOMImplementationRegistry;
import  org.w3c.dom.Document;
import  org.w3c.dom.ls.DOMImplementationLS;
import  org.w3c.dom.ls.LSParser;

...

DOMImplementationRegistry registry = 
    DOMImplementationRegistry.newInstance();

DOMImplementationLS impl = 
    (DOMImplementationLS)registry.getDOMImplementation("LS");

LSParser builder = impl.createLSParser(
    DOMImplementationLS.MODE_SYNCHRONOUS, null);
	
Document document = builder.parseURI("data/personal.xml");</source>
      <note>You can now use DOM Level 3 Load/Save and Core interfaces with the regular Xerces distribution. 
      </note>
    </a>
  </faq>

  <faq title="Serializing a DOM document">
    <q>How do I serialize DOM to an output stream?</q>
    <a><anchor name="dom-xml-serialization"/>
      <p>You can serialize a DOM tree by using the DOM Level 3 Load and Save. 
	<code>LSSerializer</code> performs automatic namespace fixup to make your document namespace
	well-formed.
      </p>
      <source>import  org.w3c.dom.bootstrap.DOMImplementationRegistry;
import  org.w3c.dom.Document;
import  org.w3c.dom.ls.DOMImplementationLS;
import  org.w3c.dom.ls.LSSerializer;

...

DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();

DOMImplementationLS impl = 
    (DOMImplementationLS)registry.getDOMImplementation("LS");

...     

LSSerializer writer = impl.createLSSerializer();
String str = writer.writeToString(document);</source>  

      <p>
	You can also serialize a DOM tree by using the JAXP Transformer API.
      </p>

      <p>
	It is also possible to serialize a DOM tree by using the Xerces <code>org.apache.xml.XMLSerializer</code> serialization code directly.  
	This non-standard way of serializing a DOM has been <strong>deprecated</strong> since Xerces-J 2.9.0 and should be avoided if possible.
      </p>
      <source>import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.apache.xml.serialize.LineSeparator;

...

OutputFormat format = new OutputFormat((Document)core);
format.setLineSeparator(LineSeparator.Windows);
format.setIndenting(true);
format.setLineWidth(0);             
format.setPreserveSpace(true);
XMLSerializer serializer = new XMLSerializer (
    new FileOutputStream("output.xml"), format);
serializer.asDOMSerializer();
serializer.serialize(document);</source>
    </a>
  </faq>
  
  <faq title="Java Object Serialization of a DOM">
    <q>Does Xerces DOM implement java.io.Serializable?</q>
    <a>
      <p>Yes. Xerces DOM can be serialized using Java object serialization.
         It is recommended that a DOM be serialized as 
         <link anchor='dom-xml-serialization'>XML</link> where possible
         instead of using object serialization.
      </p>
      <p>By choosing object serialization you sacrifice interoperability 
         between parsers and we do not guarantee interoperability 
         between versions of Xerces. It should be used with caution.
      </p>
      <p>Some rough measurements have shown that XML serialization performs
         better than Java object serialization and that XML instance documents 
         require less storage space than object serialized DOMs.
      </p>
    </a>
  </faq>

  <faq title="Specifying non-Xerces DOM implementation">
    <q>How do I supply my own implementation of the DOM?</q>
    <a>
      <p>
	Use the
    <link idref='properties' anchor="dom.document-class-name">http://apache.org/xml/properties/dom/document-class-name</link> property
 	to register your own implementation of the 
        <code>org.w3c.dom.Document</code> interface.</p>
      <p>
        Xerces provides the following implementations of the 
	<code>org.w3c.dom.Document</code> interface:</p>
      <ul>
	<li><code>org.apache.xerces.dom.CoreDocumentImpl</code> --  
	  supports DOM Level 3 Core Recommendation.</li>
	<li><code>org.apache.xerces.dom.DocumentImpl</code> -- 
	  supports DOM Level 3 Core, Mutation Events, Traversal and Ranges.</li>
	<li><code>org.apache.xerces.dom.PSVIDocumentImpl</code> -- 
	  provides access to the post schema validation infoset via DOM.</li>
      </ul>
      
    </a>
  </faq>


  <faq title="Accessing the DOM Level 3 API">
    <q>How do I access the DOM Level 3 functionality?</q>
    <a>    <anchor name="dom3"/>
     <p>
      The DOM Level 3 functionality is now exposed by default since Xerces-J 2.7.0.
     </p>
     <p>
      The experimental interfaces which were once present in the <code>org.apache.xerces.dom3</code>
      package no longer exist. This package existed primarily so that the DOM Level 2
      and DOM Level 3 implementations in Xerces-J 2.6.2 and prior could co-exist. Code which
      depended on the <code>org.apache.xerces.dom3</code> package must be modified to use the 
      official DOM Level 3 API located in the <code>org.w3c.dom.*</code> packages.
     </p> 
     <p>For more information, refer to the <link idref='dom3'>DOM Level 3 
	Implementation</link> page.
     </p>    
    </a>
  </faq>
  
   <faq title="Using DOM Level 3 with JDK 1.4 and higher">
    <q>How do I run DOM Level 3 applications under JDK 1.4 and higher?</q>
    <a>    <anchor name="dom3-run"/>
    <p>Use the <jump href="http://download.oracle.com/javase/1.4.2/docs/guide/standards/">
    Endorsed Standards Override Mechanism</jump> to specify xercesImpl.jar and xml-apis.jar.
    A more complete description is available <jump href="http://xml.apache.org/xalan-j/faq.html#faq-N100D6">here</jump>.
    </p>
    </a>
  </faq>


  <faq title="XML Schema API and DOM">
  <q>How do I retrieve PSVI from the DOM?</q>
<a> <anchor name="xsdom"/>
<p>By default Xerces does not store the PSVI information in the DOM tree. </p>
<p>
The following source shows you how to parse an XML document (using JAXP) and how to retrieve PSVI (using the <jump href="http://www.w3.org/Submission/xmlschema-api/">XML Schema API</jump>):
<source>
//<code>dbf</code> is JAXP DocumentBuilderFactory

// all of the following features must be set:
dbf.setNamespaceAware(true);
dbf.setValidating(true);
dbf.setAttribute("http://apache.org/xml/features/validation/schema", 
    Boolean.TRUE);

// you also must specify Xerces PSVI DOM implementation
// "org.apache.xerces.dom.PSVIDocumentImpl"
dbf.setAttribute("http://apache.org/xml/properties/dom/document-class-name", 
    "org.apache.xerces.dom.PSVIDocumentImpl");

...            
Document doc = db.parse(args[0]);
if (doc.getDocumentElement().isSupported("psvi", "1.0")){
    ElementPSVI psviElem = (ElementPSVI)doc.getDocumentElement();
    XSElementDeclaration decl = psviElem.getElementDeclaration();
    ...
}</source>
</p>
<p>If you want to build the DOM tree in memory and be able to access the PSVI information you need to start by instantiating org.apache.xerces.dom.PSVIDocumentImpl or you need to use the DOM Level 3 API as shown in the following example:</p>
<source>
System.setProperty(DOMImplementationRegistry.PROPERTY,
    "org.apache.xerces.dom.DOMXSImplementationSourceImpl");
   
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();

DOMImplementation impl = 
    (DOMImplementation) registry.getDOMImplementation("psvi");
</source>

The PSVI information will not be added or modified as you modify the tree in memory. Instead, if you want to get updated PSVI information, you need to validate your DOM in memory using the <jump href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#Document3-normalizeDocument">normalizeDocument</jump> method as described in the <jump href="#xsrevalidate">next question</jump>.

<p>You can find more information about how to use the XML Schema API <jump href="faq-xs.html">here</jump>.</p>
</a>
</faq>

  <faq title="Revalidation of DOM document in Memory">
     
  	<q>How can I make sure that my DOM document in memory conforms to a schema?</q>
  	<a><anchor name="xsrevalidate"/>
  		<p>
  			DOM revalidation is supported via W3C DOM Level 3 Core
  			<em>Document.normalizeDocument()</em>.
  		</p>
  		<note>This release only supports revalidation against XML Schemas and DTDs. Revalidation against other schema types is not implemented.</note>

  		<p>To revalidate the document you need:</p>
  		<ul>
  			<li>
  				<jump href="#domparser">Create</jump> the DOMParser.
  			</li>
  			<li>
  				Retrieve <code>DOMConfiguration</code> from the <code>Document</code>, 
  				and set <em>validate</em> feature to true.
  			</li>
  			<li>
  			   Provide XML Schemas (agains which validation should occur)
  			   by either setting <em>xsi:schemaLocation</em> /
  				<em>xsi:noSchemaLocation</em> attributes on the <code>documentElement</code>, or
  			   by setting <code>schema-location</code> parameter on the 
  			   <code>DOMConfiguration</code>.
  			</li>
  			<li>
  				Relative URIs for the schema documents will be resolved relative to the
  		       <jump href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#Document3-documentURI">documentURI</jump>
  		       (which should be set).
  		       Otherwise, you can implement your own <code>LSResourceResolver</code> and set it 
  		       via <code>resource-resolver</code> on the <code>DOMConfiguration</code>.
  			</li>
  		</ul>
  		<p>
  			<strong>Note:</strong> if a document contains any DOM Level 1 nodes (the nodes created using createElement, 
  			createAttribute, etc.) a fatal error will occur as described in the 
  			<jump href='http://www.w3.org/TR/DOM-Level-3-Core/namespaces-algorithms.html'>Namespace Normalization</jump>
  			algorithm.
  			In general, the
  			<jump href='http://www.w3.org/TR/DOM-Level-3-Core/core.html#Namespaces-Considerations'>DOM specification</jump>
  			discourages using DOM Level 1 nodes in the namespace aware application:
  		</p>
  		<p><em>DOM Level 1 methods are namespace ignorant. Therefore, while it is safe to use these methods when not 
  		dealing with namespaces, using them and the new ones at the same time should be avoided. DOM Level 1 methods 
  		solely identify attribute nodes by their nodeName. On the contrary, the DOM Level 2 methods related to namespaces, 
  		identify attribute nodes by their namespaceURI and localName. Because of this fundamental difference, mixing both 
  		sets of methods can lead to unpredictable results.</em></p>
 
  		<source>
import org.w3c.dom.Document;
import org.w3c.dom.DOMConfiguration;
import org.w3c.dom.ls.LSParser;

..... 

Document document = builder.parseURI("data/personal-schema.xml");
DOMConfiguration config = document.getDomConfig();
config.setParameter("error-handler",new MyErrorHandler());
config.setParameter("schema-type", "http://www.w3.org/2001/XMLSchema");
config.setParameter("validate", Boolean.TRUE);
document.normalizeDocument();</source>

  		<p>
  			For more information, please refer to the
  			<link idref='dom3'>DOM Level 3 Implementation</link>
  			page.
  		</p>
  	</a>
  </faq>

  <faq title='Handling Errors in DOM'>
    <q>How do I handle errors?</q>
    <a>
      <p>
	You should register an error handler with the parser by supplying
	a class which implements the <code>org.xml.sax.ErrorHandler</code>
	interface. This is true regardless of whether your parser is a
	DOM based or SAX based parser.
      </p>
      <p>
	You can register an error handler on a <code>DocumentBuilder</code>
	created using JAXP like this:
      </p>
      <source>import javax.xml.parsers.DocumentBuilder;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

ErrorHandler handler = new ErrorHandler() {
    public void warning(SAXParseException e) throws SAXException {
        System.err.println("[warning] "+e.getMessage());
    }
    public void error(SAXParseException e) throws SAXException {
        System.err.println("[error] "+e.getMessage());
    }
    public void fatalError(SAXParseException e) throws SAXException {
        System.err.println("[fatal error] "+e.getMessage());
        throw e;
    }
};

DocumentBuilder builder = /* builder instance */;
builder.setErrorHandler(handler);</source>
      <p>If you are using <jump href="http://www.w3.org/DOM/DOMTR#DOML3">DOM Level 3</jump> 
	you can register an error handler with the <code>LSParser</code> by supplying
	a class which implements the <code>org.w3c.dom.DOMErrorHandler</code>
	interface. <strong>Note:</strong> all exceptions during parsing or saving XML data 
	are reported via DOMErrorHandler.</p>
    </a>
  </faq>


  <faq title='Controlling Entity Representation'>
    <q>How can I control the way that entities are represented in the DOM?</q>
    <a>
      <p>The Xerces  <code>http://apache.org/xml/features/dom/create-entity-ref-nodes</code> 
        feature
	(or corresponding DOM Level 3 LSParser <code>entities</code> feature)  
	controls how entities appear in the DOM tree. When one of those features 
	is set to true (the default), an occurrence of an entity reference
	in the XML document will be represented by a subtree with an 
	EntityReference node at the root whose children represent the 
	entity expansion.
      </p>
      <p>
	If the feature is false, an entity reference in the XML document
	is represented by only the nodes that represent the entity 
	expansion.
      </p> 
      <p>
	In either case, the entity expansion will be a DOM tree 
	representing the structure of the entity expansion, not a text
	node containing the entity expansion as text.
      </p>
    </a>
  </faq>


  <faq title='Associating user data with a Node'>
    <q>How do I associate my own data with a node in the DOM tree?</q>
    <a>
      <p>
	The class <code>org.apache.xerces.dom.NodeImpl</code> provides the 
	<code>setUserData(Object o)</code> and the <code>Object 
	  getUserData()</code> methods that you can use to attach any object
	to a node in the DOM tree.
      </p>
      <p>
	Beware that you should try and remove references to your data on
	nodes you no longer use (by calling <code>setUserData(null)</code>,
	or these nodes will not be garbage collected until the entire
	document is garbage collected.
      </p>
      <p>If you are using Xerces with the DOM Level 3 support  
	you can use <code>org.w3c.dom.Node.setUserData()</code> and register your own 
	<code>UserDataHandler</code>. </p>
    </a>
  </faq>

<faq title='Making getElementById work'>
  <q>Why does getElementById not work for documents validated against XML Schemas?</q>
  <a>
  <p>Make sure the <link idref='features' anchor="validation">validation feature</link> and the 
<link idref='features' anchor="validation.schema">schema feature</link> are turned on before you parse a document.
   
  </p>
  </a>
 </faq>
 
 
   <faq title="Setting ID attribute">
    <q>How do I specify an ID attribute in the DOM?</q>
    <a> <p>You can use the DOM level 3 setIdAttribute, setIdAttributeNS, and setIdAttributeNode methods
    to specify ID attribute in the DOM. See <jump href="#dom3">DOM Level 3</jump>.
      </p>
    </a>
  </faq>
  
     <faq title="Accessing type information">
    <q>How do I access type information in the DOM?</q>
    <a> <p><jump href="#dom3">DOM Level 3</jump> defines a  <jump href="http://www.w3.org/TR/DOM-Level-3-Core/core.html#TypeInfo">TypeInfo</jump> 
    interface that exposes type information for 
     element and attribute nodes. The type information depends on the document schema and is only available
     if Xerces was able to find the corresponding grammar (DOM Level 3 <code>validate</code> or 
     <code>validate-if-schema</code> feature must be turned on).  
     If you need to access the full PSVI in the DOM please refer to <link idref='faq-xs' anchor='dom3-psvi'>Using XML Schemas</link>.
      </p>
    </a>
  </faq>
</faqs>
