Java/XML/Schema

Материал из Java эксперт
Перейти к: навигация, поиск

Create XML validator from XML schema

   <source lang="java">
   


import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; public class Main {

 public static void main(String[] argv) throws Exception {
   String schemaLang = "http://www.w3.org/2001/XMLSchema";
   SchemaFactory factory = SchemaFactory.newInstance(schemaLang);
   Schema schema = factory.newSchema(new StreamSource("sample.xsd"));
   Validator validator = schema.newValidator();
   validator.validate(new StreamSource("sample.xml"));
 }

}



 </source>
   
  
 
  



Encoder and Decoder for XML element and attribute names

   <source lang="java">
 

/*

* JBoss DNA (http://www.jboss.org/dna)
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.  Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
* See the AUTHORS.txt file in the distribution for a full listing of 
* individual contributors. 
*
* JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA
* is licensed to you under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* JBoss DNA is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

import java.text.CharacterIterator; import java.text.StringCharacterIterator; import java.util.BitSet; /**

* An {@link TextEncoder encoder} and {@link TextDecoder decoder} for XML element and attribute names.
*

* Any UTF-16 unicode character that is not a valid XML name character according to the is escaped as _xHHHH_, where HHHH stands for the four-digit * hexadecimal UTF-16 unicode value for the character in the most significant bit first order. For example, the name "Customer_ID" * is encoded as "Customer_x0020_ID". *

*

* Decoding transforms every _xHHHH_ encoding sequences back into the UTF-16 character. Note that * {@link #decode(String) decoding} can be safely done on any XML name, even if the name does not contain any encoded sequences. *

* 
* @author Randall Hauch
*/

public class XmlNameEncoder {

   private static final BitSet XML_NAME_ALLOWED_CHARACTERS = new BitSet(2 ^ 16);
   static {
       // Initialize the unescaped bitset ...
       // XML Names may contain: Letter | Digit | "." | "-" | "_" | ":" | CombiningChar | Extender
       XML_NAME_ALLOWED_CHARACTERS.set(".");
       XML_NAME_ALLOWED_CHARACTERS.set("-");
       XML_NAME_ALLOWED_CHARACTERS.set("_");
       XML_NAME_ALLOWED_CHARACTERS.set(":");
       // XML Base Character Set
       XML_NAME_ALLOWED_CHARACTERS.set("\u0041", "\u005A" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0061", "\u007A" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u00C0", "\u00D6" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u00D8", "\u00F6" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u00F8", "\u00FF" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0100", "\u0131" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0134", "\u013E" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0141", "\u0148" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u014A", "\u017E" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0180", "\u01C3" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u01CD", "\u01F0" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u01F4", "\u01F5" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u01FA", "\u0217" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0250", "\u02A8" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u02BB", "\u02C1" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0386");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0388", "\u038A" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u038C");
       XML_NAME_ALLOWED_CHARACTERS.set("\u038E", "\u03A1" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u03A3", "\u03CE" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u03D0", "\u03D6" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u03DA");
       XML_NAME_ALLOWED_CHARACTERS.set("\u03DC");
       XML_NAME_ALLOWED_CHARACTERS.set("\u03DE");
       XML_NAME_ALLOWED_CHARACTERS.set("\u03E0");
       XML_NAME_ALLOWED_CHARACTERS.set("\u03E2", "\u03F3" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0401", "\u040C" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u040E", "\u044F" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0451", "\u045C" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u045E", "\u0481" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0490", "\u04C4" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u04C7", "\u04C8" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u04CB", "\u04CC" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u04D0", "\u04EB" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u04EE", "\u04F5" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u04F8", "\u04F9" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0531", "\u0556" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0559");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0561", "\u0586" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u05D0", "\u05EA" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u05F0", "\u05F2" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0621", "\u063A" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0641", "\u064A" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0671", "\u06B7" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u06BA", "\u06BE" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u06C0", "\u06CE" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u06D0", "\u06D3" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u06D5");
       XML_NAME_ALLOWED_CHARACTERS.set("\u06E5", "\u06E6" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0905", "\u0939" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u093D");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0958", "\u0961" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0985", "\u098C" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u098F", "\u0990" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0993", "\u09A8" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u09AA", "\u09B0" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u09B2");
       XML_NAME_ALLOWED_CHARACTERS.set("\u09B6", "\u09B9" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u09DC", "\u09DD" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u09DF", "\u09E1" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u09F0", "\u09F1" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A05", "\u0A0A" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A0F", "\u0A10" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A13", "\u0A28" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A2A", "\u0A30" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A32", "\u0A33" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A35", "\u0A36" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A38", "\u0A39" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A59", "\u0A5C" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A5E");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A72", "\u0A74" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A85", "\u0A8B" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A8D");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A8F", "\u0A91" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A93", "\u0AA8" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0AAA", "\u0AB0" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0AB2", "\u0AB3" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0AB5", "\u0AB9" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0ABD");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0AE0");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B05", "\u0B0C" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B0F", "\u0B10" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B13", "\u0B28" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B2A", "\u0B30" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B32", "\u0B33" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B36", "\u0B39" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B3D");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B5C", "\u0B5D" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B5F", "\u0B61" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B85", "\u0B8A" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B8E", "\u0B90" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B92", "\u0B95" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B99", "\u0B9A" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B9C");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B9E", "\u0B9F" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0BA3", "\u0BA4" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0BA8", "\u0BAA" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0BAE", "\u0BB5" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0BB7", "\u0BB9" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C05", "\u0C0C" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C0E", "\u0C10" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C12", "\u0C28" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C2A", "\u0C33" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C35", "\u0C39" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C60", "\u0C61" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C85", "\u0C8C" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C8E", "\u0C90" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C92", "\u0CA8" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0CAA", "\u0CB3" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0CB5", "\u0CB9" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0CDE");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0CE0", "\u0CE1" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0D05", "\u0D0C" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0D0E", "\u0D10" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0D12", "\u0D28" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0D2A", "\u0D39" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0D60", "\u0D61" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E01", "\u0E2E" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E30");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E32", "\u0E33" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E40", "\u0E45" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E81", "\u0E82" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E84");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E87", "\u0E88" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E8A");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E8D");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E94", "\u0E97" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E99", "\u0E9F" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EA1", "\u0EA3" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EA5");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EA7");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EAA", "\u0EAB" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EAD", "\u0EAE" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EB0");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EB2", "\u0EB3" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EBD");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EC0", "\u0EC4" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F40", "\u0F47" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F49", "\u0F69" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u10A0", "\u10C5" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u10D0", "\u10F6" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1100");
       XML_NAME_ALLOWED_CHARACTERS.set("\u1102", "\u1103" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1105", "\u1107" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1109");
       XML_NAME_ALLOWED_CHARACTERS.set("\u110B", "\u110C" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u110E", "\u1112" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u113C");
       XML_NAME_ALLOWED_CHARACTERS.set("\u113E");
       XML_NAME_ALLOWED_CHARACTERS.set("\u1140");
       XML_NAME_ALLOWED_CHARACTERS.set("\u114C");
       XML_NAME_ALLOWED_CHARACTERS.set("\u114E");
       XML_NAME_ALLOWED_CHARACTERS.set("\u1150");
       XML_NAME_ALLOWED_CHARACTERS.set("\u1154", "\u1155" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1159");
       XML_NAME_ALLOWED_CHARACTERS.set("\u115F", "\u1161" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1163");
       XML_NAME_ALLOWED_CHARACTERS.set("\u1165");
       XML_NAME_ALLOWED_CHARACTERS.set("\u1167");
       XML_NAME_ALLOWED_CHARACTERS.set("\u1169");
       XML_NAME_ALLOWED_CHARACTERS.set("\u116D", "\u116E" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1172", "\u1173" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1175");
       XML_NAME_ALLOWED_CHARACTERS.set("\u119E");
       XML_NAME_ALLOWED_CHARACTERS.set("\u11A8");
       XML_NAME_ALLOWED_CHARACTERS.set("\u11AB");
       XML_NAME_ALLOWED_CHARACTERS.set("\u11AE", "\u11AF" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u11B7", "\u11B8" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u11BA");
       XML_NAME_ALLOWED_CHARACTERS.set("\u11BC", "\u11C2" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u11EB");
       XML_NAME_ALLOWED_CHARACTERS.set("\u11F0");
       XML_NAME_ALLOWED_CHARACTERS.set("\u11F9");
       XML_NAME_ALLOWED_CHARACTERS.set("\u1E00", "\u1E9B" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1EA0", "\u1EF9" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1F00", "\u1F15" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1F18", "\u1F1D" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1F20", "\u1F45" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1F48", "\u1F4D" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1F50", "\u1F57" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1F59");
       XML_NAME_ALLOWED_CHARACTERS.set("\u1F5B");
       XML_NAME_ALLOWED_CHARACTERS.set("\u1F5D");
       XML_NAME_ALLOWED_CHARACTERS.set("\u1F5F", "\u1F7D" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1F80", "\u1FB4" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1FB6", "\u1FBC" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1FBE");
       XML_NAME_ALLOWED_CHARACTERS.set("\u1FC2", "\u1FC4" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1FC6", "\u1FCC" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1FD0", "\u1FD3" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1FD6", "\u1FDB" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1FE0", "\u1FEC" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1FF2", "\u1FF4" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u1FF6", "\u1FFC" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u2126");
       XML_NAME_ALLOWED_CHARACTERS.set("\u212A", "\u212B" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u212E");
       XML_NAME_ALLOWED_CHARACTERS.set("\u2180", "\u2182" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u3041", "\u3094" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u30A1", "\u30FA" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u3105", "\u312C" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\uAC00", "\uD7A3" + 1);
       // XML Ideograph Character Set
       XML_NAME_ALLOWED_CHARACTERS.set("\u4E00", "\u9FA5" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u3007");
       XML_NAME_ALLOWED_CHARACTERS.set("\u3021", "\u3029" + 1);
       // XML Combining Character Set
       XML_NAME_ALLOWED_CHARACTERS.set("\u0300", "\u0345" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0360", "\u0361" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0483", "\u0486" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0591", "\u05A1" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u05A3", "\u05B9" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u05BB", "\u05BD" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u05BF");
       XML_NAME_ALLOWED_CHARACTERS.set("\u05C1", "\u05C2" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u05C4");
       XML_NAME_ALLOWED_CHARACTERS.set("\u064B", "\u0652" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0670");
       XML_NAME_ALLOWED_CHARACTERS.set("\u06D6", "\u06DC" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u06DD", "\u06DF" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u06E0", "\u06E4" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u06E7", "\u06E8" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u06EA", "\u06ED" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0901", "\u0903" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u093C");
       XML_NAME_ALLOWED_CHARACTERS.set("\u093E", "\u094C" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u094D");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0951", "\u0954" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0962", "\u0963" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0981", "\u0983" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u09BC");
       XML_NAME_ALLOWED_CHARACTERS.set("\u09BE");
       XML_NAME_ALLOWED_CHARACTERS.set("\u09BF");
       XML_NAME_ALLOWED_CHARACTERS.set("\u09C0", "\u09C4" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u09C7", "\u09C8" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u09CB", "\u09CD" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u09D7");
       XML_NAME_ALLOWED_CHARACTERS.set("\u09E2", "\u09E3" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A02");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A3C");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A3E");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A3F");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A40", "\u0A42" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A47", "\u0A48" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A4B", "\u0A4D" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A70", "\u0A71" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A81", "\u0A83" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0ABC");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0ABE", "\u0AC5" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0AC7", "\u0AC9" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0ACB", "\u0ACD" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B01", "\u0B03" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B3C");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B3E", "\u0B43" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B47", "\u0B48" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B4B", "\u0B4D" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B56", "\u0B57" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B82", "\u0B83" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0BBE", "\u0BC2" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0BC6", "\u0BC8" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0BCA", "\u0BCD" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0BD7");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C01", "\u0C03" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C3E", "\u0C44" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C46", "\u0C48" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C4A", "\u0C4D" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C55", "\u0C56" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C82", "\u0C83" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0CBE", "\u0CC4" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0CC6", "\u0CC8" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0CCA", "\u0CCD" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0CD5", "\u0CD6" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0D02", "\u0D03" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0D3E", "\u0D43" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0D46", "\u0D48" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0D4A", "\u0D4D" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0D57");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E31");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E34", "\u0E3A" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E47", "\u0E4E" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EB1");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EB4", "\u0EB9" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EBB", "\u0EBC" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EC8", "\u0ECD" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F18", "\u0F19" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F35");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F37");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F39");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F3E");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F3F");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F71", "\u0F84" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F86", "\u0F8B" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F90", "\u0F95" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F97");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F99", "\u0FAD" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0FB1", "\u0FB7" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0FB9");
       XML_NAME_ALLOWED_CHARACTERS.set("\u20D0", "\u20DC" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u20E1");
       XML_NAME_ALLOWED_CHARACTERS.set("\u302A", "\u302F" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u3099");
       XML_NAME_ALLOWED_CHARACTERS.set("\u309A");
       // XML Digits
       XML_NAME_ALLOWED_CHARACTERS.set("\u0030", "\u0039" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0660", "\u0669" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u06F0", "\u06F9" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0966", "\u096F" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u09E6", "\u09EF" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0A66", "\u0A6F" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0AE6", "\u0AEF" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0B66", "\u0B6F" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0BE7", "\u0BEF" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0C66", "\u0C6F" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0CE6", "\u0CEF" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0D66", "\u0D6F" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E50", "\u0E59" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0ED0", "\u0ED9" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u0F20", "\u0F29" + 1);
       // XML Extenders
       XML_NAME_ALLOWED_CHARACTERS.set("\u00B7");
       XML_NAME_ALLOWED_CHARACTERS.set("\u02D0");
       XML_NAME_ALLOWED_CHARACTERS.set("\u02D1");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0387");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0640");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0E46");
       XML_NAME_ALLOWED_CHARACTERS.set("\u0EC6");
       XML_NAME_ALLOWED_CHARACTERS.set("\u3005");
       XML_NAME_ALLOWED_CHARACTERS.set("\u3031", "\u3035" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u309D", "\u309E" + 1);
       XML_NAME_ALLOWED_CHARACTERS.set("\u30FC", "\u30FE" + 1);
   }
   /**
    * {@inheritDoc}
    * 
    * @see org.jboss.dna.rumon.text.TextDecoder#decode(java.lang.String)
    */
   public String decode( String encodedText ) {
       if (encodedText == null) return null;
       if (encodedText.length() < 7) {
           // Not big enough to have an encoded sequence
           return encodedText;
       }
       StringBuilder sb = new StringBuilder();
       char[] digits = new char[4];
       CharacterIterator iter = new StringCharacterIterator(encodedText);
       for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
           if (c == "_") {
               // Read the next character, if there is one ...
               char next = iter.next();
               if (next == CharacterIterator.DONE) {
                   sb.append(c);
                   break;
               }
               // If the next character is not "x", then these are just regular characters ...
               if (next != "x") {
                   sb.append(c).append(next);
                   continue;
               }
               // Read the next 4 characters (digits) and another "_" character ...
               digits[0] = iter.next();
               if (digits[0] == CharacterIterator.DONE) {
                   sb.append(c).append(next);
                   break;
               }
               digits[1] = iter.next();
               if (digits[1] == CharacterIterator.DONE) {
                   sb.append(c).append(next).append(digits, 0, 1);
                   break;
               }
               digits[2] = iter.next();
               if (digits[2] == CharacterIterator.DONE) {
                   sb.append(c).append(next).append(digits, 0, 2);
                   break;
               }
               digits[3] = iter.next();
               if (digits[3] == CharacterIterator.DONE) {
                   sb.append(c).append(next).append(digits, 0, 3);
                   break;
               }
               char underscore = iter.next();
               if (underscore != "_") { // includes DONE
                   sb.append(c).append(next).append(digits, 0, 4);
                   if (underscore == CharacterIterator.DONE) break;
                   sb.append(underscore);
                   continue;
               }
               // We"ve read all 4 digits, including the trailing "_"
               // Now parse into the resulting character
               try {
                   sb.appendCodePoint(Integer.parseInt(new String(digits), 16));
               } catch (NumberFormatException e) {
                   // code was not hexadecimal, so just write out the characters as is ...
                   sb.append(c).append(next).append(digits).append(underscore);
               }
           } else {
               // Just append other characters ...
               sb.append(c);
           }
       }
       return sb.toString();
   }
   /**
    * {@inheritDoc}
    * 
    * @see org.jboss.dna.rumon.text.TextEncoder#encode(java.lang.String)
    */
   public String encode( String text ) {
       if (text == null) return null;
       if (text.length() == 0) return text;
       StringBuilder sb = new StringBuilder();
       String hex = null;
       CharacterIterator iter = new StringCharacterIterator(text);
       for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
           if (c == "_") {
               // Read the next character (if there is one) ...
               char next = iter.next();
               if (next == CharacterIterator.DONE) {
                   sb.append(c);
                   break;
               }
               // If the next character is not "x", then these are just regular characters ...
               if (next != "x") {
                   sb.append(c).append(next);
                   continue;
               }
               // The next character is "x", so write out the "_" character in encoded form ...
               sb.append("_x005f_");
               // And then write out the next character ...
               sb.append(next);
           } else if (XML_NAME_ALLOWED_CHARACTERS.get(c)) {
               // Legal characters for an XML Name ...
               sb.append(c);
           } else {
               // All other characters must be escaped with "_xHHHH_" where "HHHH" is the hex string for the code point
               hex = Integer.toHexString(c);
               // The hex string excludes the leading "0"s, so check the character values so we know how many to prepend
               if (c >= "\u0000" && c <= "\u000f") {
                   sb.append("_x000").append(hex);
               } else if (c >= "\u0010" && c <= "\u00ff") {
                   sb.append("_x00").append(hex);
               } else if (c >= "\u0100" && c <= "\u0fff") {
                   sb.append("_x0").append(hex);
               } else {
                   sb.append("_x").append(hex);
               }
               sb.append("_");
           }
       }
       return sb.toString();
   }

}


 </source>
   
  
 
  



Provides a trace of the schema type information for elements and attributes in an XML document.

   <source lang="java">

/*

* 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.
*/

import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.Vector; import javax.xml.XMLConstants; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.TypeInfoProvider; import javax.xml.validation.ValidatorHandler; import org.w3c.dom.TypeInfo; import org.xml.sax.Attributes; import org.xml.sax.DTDHandler; import org.xml.sax.Locator; import org.xml.sax.Parser; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.SAXParseException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.ParserAdapter; import org.xml.sax.helpers.ParserFactory; import org.xml.sax.helpers.XMLReaderFactory; /**

*

* Provides a trace of the schema type information for elements and attributes * in an XML document. This demonstrates usage of the JAXP 1.3 Validation API, * particuarly how to read type information from a TypeInfoProvider. *

* 
* @author Michael Glavassevich, IBM
* 
* @version $Id: TypeInfoWriter.java 447685 2006-09-19 02:37:49Z mrglavas $
*/

public class TypeInfoWriter extends DefaultHandler {

 //
 // Constants
 //
 // feature ids
 /**
  * Schema full checking feature id
  * (http://apache.org/xml/features/validation/schema-full-checking).
  */
 protected static final String SCHEMA_FULL_CHECKING_FEATURE_ID = "http://apache.org/xml/features/validation/schema-full-checking";
 /**
  * Honour all schema locations feature id
  * (http://apache.org/xml/features/honour-all-schemaLocations).
  */
 protected static final String HONOUR_ALL_SCHEMA_LOCATIONS_ID = "http://apache.org/xml/features/honour-all-schemaLocations";
 /**
  * Validate schema annotations feature id
  * (http://apache.org/xml/features/validate-annotations)
  */
 protected static final String VALIDATE_ANNOTATIONS_ID = "http://apache.org/xml/features/validate-annotations";
 /**
  * Generate synthetic schema annotations feature id
  * (http://apache.org/xml/features/generate-synthetic-annotations).
  */
 protected static final String GENERATE_SYNTHETIC_ANNOTATIONS_ID = "http://apache.org/xml/features/generate-synthetic-annotations";
 // default settings
 /** Default schema language (http://www.w3.org/2001/XMLSchema). */
 protected static final String DEFAULT_SCHEMA_LANGUAGE = XMLConstants.W3C_XML_SCHEMA_NS_URI;
 /** Default parser name (org.apache.xerces.parsers.SAXParser). */
 protected static final String DEFAULT_PARSER_NAME = "org.apache.xerces.parsers.SAXParser";
 /** Default schema full checking support (false). */
 protected static final boolean DEFAULT_SCHEMA_FULL_CHECKING = false;
 /** Default honour all schema locations (false). */
 protected static final boolean DEFAULT_HONOUR_ALL_SCHEMA_LOCATIONS = false;
 /** Default validate schema annotations (false). */
 protected static final boolean DEFAULT_VALIDATE_ANNOTATIONS = false;
 /** Default generate synthetic schema annotations (false). */
 protected static final boolean DEFAULT_GENERATE_SYNTHETIC_ANNOTATIONS = false;
 //
 // Data
 //
 /** TypeInfo provider. */
 protected TypeInfoProvider fTypeInfoProvider;
 /** Print writer. */
 protected PrintWriter fOut;
 /** Indent level. */
 protected int fIndent;
 //
 // Constructors
 //
 /** Default constructor. */
 public TypeInfoWriter() {
 }
 //
 // ContentHandler and DocumentHandler methods
 //
 /** Set document locator. */
 public void setDocumentLocator(Locator locator) {
   fIndent = 0;
   printIndent();
   fOut.print("setDocumentLocator(");
   fOut.print("systemId=");
   printQuotedString(locator.getSystemId());
   fOut.print(", publicId=");
   printQuotedString(locator.getPublicId());
   fOut.println(")");
   fOut.flush();
 } // setDocumentLocator(Locator)
 /** Start document. */
 public void startDocument() throws SAXException {
   fIndent = 0;
   printIndent();
   fOut.println("startDocument()");
   fOut.flush();
   fIndent++;
 } // startDocument()
 /** Start element. */
 public void startElement(String uri, String localName, String qname, Attributes attributes)
     throws SAXException {
   TypeInfo type;
   printIndent();
   fOut.print("startElement(");
   fOut.print("name=");
   printQName(uri, localName);
   fOut.print(",");
   fOut.print("type=");
   if (fTypeInfoProvider != null && (type = fTypeInfoProvider.getElementTypeInfo()) != null) {
     printQName(type.getTypeNamespace(), type.getTypeName());
   } else {
     fOut.print("null");
   }
   fOut.print(",");
   fOut.print("attributes=");
   if (attributes == null) {
     fOut.println("null");
   } else {
     fOut.print("{");
     int length = attributes.getLength();
     for (int i = 0; i < length; i++) {
       if (i > 0) {
         fOut.print(",");
       }
       String attrURI = attributes.getURI(i);
       String attrLocalName = attributes.getLocalName(i);
       fOut.print("{");
       fOut.print("name=");
       printQName(attrURI, attrLocalName);
       fOut.print(",");
       fOut.print("type=");
       if (fTypeInfoProvider != null && (type = fTypeInfoProvider.getAttributeTypeInfo(i)) != null) {
         printQName(type.getTypeNamespace(), type.getTypeName());
       } else {
         fOut.print("null");
       }
       fOut.print(",");
       fOut.print("id=");
       fOut.print(fTypeInfoProvider != null && fTypeInfoProvider.isIdAttribute(i) ? "\"true\""
           : "\"false\"");
       fOut.print(",");
       fOut.print("specified=");
       fOut.print(fTypeInfoProvider == null || fTypeInfoProvider.isSpecified(i) ? "\"true\""
           : "\"false\"");
       fOut.print("}");
     }
     fOut.print("}");
   }
   fOut.println(")");
   fOut.flush();
   fIndent++;
 } // startElement(String,String,String,Attributes)
 /** End element. */
 public void endElement(String uri, String localName, String qname) throws SAXException {
   fIndent--;
   printIndent();
   fOut.print("endElement(");
   fOut.print("name=");
   printQName(uri, localName);
   fOut.println(")");
   fOut.flush();
 } // endElement(String,String,String)
 /** End document. */
 public void endDocument() throws SAXException {
   fIndent--;
   printIndent();
   fOut.println("endDocument()");
   fOut.flush();
 } // endDocument()
 //
 // ErrorHandler methods
 //
 /** Warning. */
 public void warning(SAXParseException ex) throws SAXException {
   printError("Warning", ex);
 } // warning(SAXParseException)
 /** Error. */
 public void error(SAXParseException ex) throws SAXException {
   printError("Error", ex);
 } // error(SAXParseException)
 /** Fatal error. */
 public void fatalError(SAXParseException ex) throws SAXException {
   printError("Fatal Error", ex);
   throw ex;
 } // fatalError(SAXParseException)
 //
 // Public methods
 //
 /** Sets the output stream for printing. */
 public void setOutput(OutputStream stream, String encoding) throws UnsupportedEncodingException {
   if (encoding == null) {
     encoding = "UTF8";
   }
   java.io.Writer writer = new OutputStreamWriter(stream, encoding);
   fOut = new PrintWriter(writer);
 } // setOutput(OutputStream,String)
 //
 // Protected methods
 //
 /** Sets the TypeInfoProvider used by this writer. */
 protected void setTypeInfoProvider(TypeInfoProvider provider) {
   fTypeInfoProvider = provider;
 }
 /** Prints the error message. */
 protected void printError(String type, SAXParseException ex) {
   System.err.print("[");
   System.err.print(type);
   System.err.print("] ");
   String systemId = ex.getSystemId();
   if (systemId != null) {
     int index = systemId.lastIndexOf("/");
     if (index != -1)
       systemId = systemId.substring(index + 1);
     System.err.print(systemId);
   }
   System.err.print(":");
   System.err.print(ex.getLineNumber());
   System.err.print(":");
   System.err.print(ex.getColumnNumber());
   System.err.print(": ");
   System.err.print(ex.getMessage());
   System.err.println();
   System.err.flush();
 } // printError(String,SAXParseException)
 /** Prints the indent. */
 protected void printIndent() {
   for (int i = 0; i < fIndent; i++) {
     fOut.print(" ");
   }
 } // printIndent()
 protected void printQName(String uri, String localName) {
   if (uri != null && uri.length() > 0) {
     printQuotedString("{" + uri + "}" + localName);
     return;
   }
   printQuotedString(localName);
 }
 /** Print quoted string. */
 protected void printQuotedString(String s) {
   if (s == null) {
     fOut.print("null");
     return;
   }
   fOut.print(""");
   fOut.print(s);
   fOut.print(""");
 } // printQuotedString(String)
 //
 // MAIN
 //
 /** Main program entry point. */
 public static void main(String[] argv) {
   // is there anything to do?
   if (argv.length == 0) {
     printUsage();
     System.exit(1);
   }
   // variables
   XMLReader parser = null;
   Vector schemas = null;
   Vector instances = null;
   String schemaLanguage = DEFAULT_SCHEMA_LANGUAGE;
   boolean schemaFullChecking = DEFAULT_SCHEMA_FULL_CHECKING;
   boolean honourAllSchemaLocations = DEFAULT_HONOUR_ALL_SCHEMA_LOCATIONS;
   boolean validateAnnotations = DEFAULT_VALIDATE_ANNOTATIONS;
   boolean generateSyntheticAnnotations = DEFAULT_GENERATE_SYNTHETIC_ANNOTATIONS;
   // process arguments
   for (int i = 0; i < argv.length; ++i) {
     String arg = argv[i];
     if (arg.startsWith("-")) {
       String option = arg.substring(1);
       if (option.equals("l")) {
         // get schema language name
         if (++i == argv.length) {
           System.err.println("error: Missing argument to -l option.");
         } else {
           schemaLanguage = argv[i];
         }
         continue;
       }
       if (option.equals("p")) {
         // get parser name
         if (++i == argv.length) {
           System.err.println("error: Missing argument to -p option.");
           continue;
         }
         String parserName = argv[i];
         // create parser
         try {
           parser = XMLReaderFactory.createXMLReader(parserName);
         } catch (Exception e) {
           try {
             Parser sax1Parser = ParserFactory.makeParser(parserName);
             parser = new ParserAdapter(sax1Parser);
             System.err.println("warning: Features and properties not supported on SAX1 parsers.");
           } catch (Exception ex) {
             parser = null;
             System.err.println("error: Unable to instantiate parser (" + parserName + ")");
             e.printStackTrace(System.err);
             System.exit(1);
           }
         }
         continue;
       }
       if (arg.equals("-a")) {
         // process -a: schema documents
         if (schemas == null) {
           schemas = new Vector();
         }
         while (i + 1 < argv.length && !(arg = argv[i + 1]).startsWith("-")) {
           schemas.add(arg);
           ++i;
         }
         continue;
       }
       if (arg.equals("-i")) {
         // process -i: instance documents
         if (instances == null) {
           instances = new Vector();
         }
         while (i + 1 < argv.length && !(arg = argv[i + 1]).startsWith("-")) {
           instances.add(arg);
           ++i;
         }
         continue;
       }
       if (option.equalsIgnoreCase("f")) {
         schemaFullChecking = option.equals("f");
         continue;
       }
       if (option.equalsIgnoreCase("hs")) {
         honourAllSchemaLocations = option.equals("hs");
         continue;
       }
       if (option.equalsIgnoreCase("va")) {
         validateAnnotations = option.equals("va");
         continue;
       }
       if (option.equalsIgnoreCase("ga")) {
         generateSyntheticAnnotations = option.equals("ga");
         continue;
       }
       if (option.equals("h")) {
         printUsage();
         continue;
       }
       System.err.println("error: unknown option (" + option + ").");
       continue;
     }
   }
   // use default parser?
   if (parser == null) {
     // create parser
     try {
       parser = XMLReaderFactory.createXMLReader(DEFAULT_PARSER_NAME);
     } catch (Exception e) {
       System.err.println("error: Unable to instantiate parser (" + DEFAULT_PARSER_NAME + ")");
       e.printStackTrace(System.err);
       System.exit(1);
     }
   }
   try {
     // Create writer
     TypeInfoWriter writer = new TypeInfoWriter();
     writer.setOutput(System.out, "UTF8");
     // Create SchemaFactory and configure
     SchemaFactory factory = SchemaFactory.newInstance(schemaLanguage);
     factory.setErrorHandler(writer);
     try {
       factory.setFeature(SCHEMA_FULL_CHECKING_FEATURE_ID, schemaFullChecking);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: SchemaFactory does not recognize feature ("
           + SCHEMA_FULL_CHECKING_FEATURE_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: SchemaFactory does not support feature ("
           + SCHEMA_FULL_CHECKING_FEATURE_ID + ")");
     }
     try {
       factory.setFeature(HONOUR_ALL_SCHEMA_LOCATIONS_ID, honourAllSchemaLocations);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: SchemaFactory does not recognize feature ("
           + HONOUR_ALL_SCHEMA_LOCATIONS_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: SchemaFactory does not support feature ("
           + HONOUR_ALL_SCHEMA_LOCATIONS_ID + ")");
     }
     try {
       factory.setFeature(VALIDATE_ANNOTATIONS_ID, validateAnnotations);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: SchemaFactory does not recognize feature ("
           + VALIDATE_ANNOTATIONS_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: SchemaFactory does not support feature ("
           + VALIDATE_ANNOTATIONS_ID + ")");
     }
     try {
       factory.setFeature(GENERATE_SYNTHETIC_ANNOTATIONS_ID, generateSyntheticAnnotations);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: SchemaFactory does not recognize feature ("
           + GENERATE_SYNTHETIC_ANNOTATIONS_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: SchemaFactory does not support feature ("
           + GENERATE_SYNTHETIC_ANNOTATIONS_ID + ")");
     }
     // Build Schema from sources
     Schema schema;
     if (schemas != null && schemas.size() > 0) {
       final int length = schemas.size();
       StreamSource[] sources = new StreamSource[length];
       for (int j = 0; j < length; ++j) {
         sources[j] = new StreamSource((String) schemas.elementAt(j));
       }
       schema = factory.newSchema(sources);
     } else {
       schema = factory.newSchema();
     }
     // Setup validator and parser
     ValidatorHandler validator = schema.newValidatorHandler();
     parser.setContentHandler(validator);
     if (validator instanceof DTDHandler) {
       parser.setDTDHandler((DTDHandler) validator);
     }
     parser.setErrorHandler(writer);
     validator.setContentHandler(writer);
     validator.setErrorHandler(writer);
     writer.setTypeInfoProvider(validator.getTypeInfoProvider());
     try {
       validator.setFeature(SCHEMA_FULL_CHECKING_FEATURE_ID, schemaFullChecking);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: Validator does not recognize feature ("
           + SCHEMA_FULL_CHECKING_FEATURE_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: Validator does not support feature ("
           + SCHEMA_FULL_CHECKING_FEATURE_ID + ")");
     }
     try {
       validator.setFeature(HONOUR_ALL_SCHEMA_LOCATIONS_ID, honourAllSchemaLocations);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: Validator does not recognize feature ("
           + HONOUR_ALL_SCHEMA_LOCATIONS_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: Validator does not support feature ("
           + HONOUR_ALL_SCHEMA_LOCATIONS_ID + ")");
     }
     try {
       validator.setFeature(VALIDATE_ANNOTATIONS_ID, validateAnnotations);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: Validator does not recognize feature ("
           + VALIDATE_ANNOTATIONS_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: Validator does not support feature ("
           + VALIDATE_ANNOTATIONS_ID + ")");
     }
     try {
       validator.setFeature(GENERATE_SYNTHETIC_ANNOTATIONS_ID, generateSyntheticAnnotations);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: Validator does not recognize feature ("
           + GENERATE_SYNTHETIC_ANNOTATIONS_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: Validator does not support feature ("
           + GENERATE_SYNTHETIC_ANNOTATIONS_ID + ")");
     }
     // Validate instance documents and print type information
     if (instances != null && instances.size() > 0) {
       final int length = instances.size();
       for (int j = 0; j < length; ++j) {
         parser.parse((String) instances.elementAt(j));
       }
     }
   } catch (SAXParseException e) {
     // ignore
   } catch (Exception e) {
     System.err.println("error: Parse error occurred - " + e.getMessage());
     if (e instanceof SAXException) {
       Exception nested = ((SAXException) e).getException();
       if (nested != null) {
         e = nested;
       }
     }
     e.printStackTrace(System.err);
   }
 } // main(String[])
 //
 // Private static methods
 //
 /** Prints the usage. */
 private static void printUsage() {
   System.err.println("usage: java jaxp.TypeInfoWriter (options) ...");
   System.err.println();
   System.err.println("options:");
   System.err.println("  -l name     Select schema language by name.");
   System.err.println("  -p name     Select parser by name.");
   System.err.println("  -a uri ...  Provide a list of schema documents");
   System.err.println("  -i uri ...  Provide a list of instance documents to validate");
   System.err.println("  -f  | -F    Turn on/off Schema full checking.");
   System.err.println("              NOTE: Not supported by all schema factories and validators.");
   System.err.println("  -hs | -HS   Turn on/off honouring of all schema locations.");
   System.err.println("              NOTE: Not supported by all schema factories and validators.");
   System.err.println("  -va | -VA   Turn on/off validation of schema annotations.");
   System.err.println("              NOTE: Not supported by all schema factories and validators.");
   System.err.println("  -ga | -GA   Turn on/off generation of synthetic schema annotations.");
   System.err.println("              NOTE: Not supported by all schema factories and validators.");
   System.err.println("  -h          This help screen.");
   System.err.println();
   System.err.println("defaults:");
   System.err.println("  Schema language:                 " + DEFAULT_SCHEMA_LANGUAGE);
   System.err.println("  Parser:                          " + DEFAULT_PARSER_NAME);
   System.err.print("  Schema full checking:            ");
   System.err.println(DEFAULT_SCHEMA_FULL_CHECKING ? "on" : "off");
   System.err.print("  Honour all schema locations:     ");
   System.err.println(DEFAULT_HONOUR_ALL_SCHEMA_LOCATIONS ? "on" : "off");
   System.err.print("  Validate annotations:            ");
   System.err.println(DEFAULT_VALIDATE_ANNOTATIONS ? "on" : "off");
   System.err.print("  Generate synthetic annotations:  ");
   System.err.println(DEFAULT_GENERATE_SYNTHETIC_ANNOTATIONS ? "on" : "off");
 } // printUsage()

} // class TypeInfoWriter

 </source>
   
  
 
  



Resolve relative URIs and SystemID strings into absolute URIs

   <source lang="java">
 

/*

* 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.
*/

/*

* $Id: SystemIDResolver.java 468655 2006-10-28 07:12:06Z minchau $
*/

import java.io.File; import java.net.URI; import javax.xml.transform.TransformerException;

/**

* This class is used to resolve relative URIs and SystemID 
* strings into absolute URIs.
*
*

This is a generic utility for resolving URIs, other than the * fact that it"s declared to throw TransformerException. Please * see code comments for details on how resolution is performed.

* @xsl.usage internal
*/

public class SystemIDResolver {

 /**
  * Get an absolute URI from a given relative URI (local path). 
  * 
*

The relative URI is a local filesystem path. The path can be * absolute or relative. If it is a relative path, it is resolved relative * to the system property "user.dir" if it is available; if not (i.e. in an * Applet perhaps which throws SecurityException) then we just return the * relative path. The space and backslash characters are also replaced to * generate a good absolute URI.

  *
  * @param localPath The relative URI to resolve
  *
  * @return Resolved absolute URI
  */
 public static String getAbsoluteURIFromRelative(String localPath)
 {
   if (localPath == null || localPath.length() == 0)
     return "";
     
   // If the local path is a relative path, then it is resolved against
   // the "user.dir" system property.
   String absolutePath = localPath;
   if (!isAbsolutePath(localPath))
   {
     try 
     {
       absolutePath = getAbsolutePathFromRelativePath(localPath);
     }
     // user.dir not accessible from applet
     catch (SecurityException se) 
     {
       return "file:" + localPath;
     }
   }
   String urlString;
   if (null != absolutePath)
   {
     if (absolutePath.startsWith(File.separator))
       urlString = "file://" + absolutePath;
     else
       urlString = "file:///" + absolutePath;        
   }
   else
     urlString = "file:" + localPath;
   
   return replaceChars(urlString);
 }
 
 /**
  * Return an absolute path from a relative path.
  *
  * @param relativePath A relative path
  * @return The absolute path
  */
 private static String getAbsolutePathFromRelativePath(String relativePath)
 {
   return new File(relativePath).getAbsolutePath();
 }
 
 /**
  * Return true if the systemId denotes an absolute URI .
  *
  * @param systemId The systemId string
  * @return true if the systemId is an an absolute URI
  */
 public static boolean isAbsoluteURI(String systemId)
 {
    /** http://www.ietf.org/rfc/rfc2396.txt
     *   Authors should be aware that a path segment which contains a colon
     * character cannot be used as the first segment of a relative URI path
     * (e.g., "this:that"), because it would be mistaken for a scheme name.
    **/
    /** 
     * %REVIEW% Can we assume here that systemId is a valid URI?
     * It looks like we cannot ( See discussion of this common problem in 
     * Bugzilla Bug 22777 ). 
    **/
    //"fix" for Bugzilla Bug 22777
   if(isWindowsAbsolutePath(systemId)){
       return false;
    }
   
   final int fragmentIndex = systemId.indexOf("#");
   final int queryIndex = systemId.indexOf("?");
   final int slashIndex = systemId.indexOf("/");
   final int colonIndex = systemId.indexOf(":");
   
   //finding substring  before "#", "?", and "/" 
   int index = systemId.length() -1;
   if(fragmentIndex > 0) 
       index = fragmentIndex;
   if((queryIndex > 0) && (queryIndex <index)) 
       index = queryIndex;
   if((slashIndex > 0) && (slashIndex <index))
       index = slashIndex; 
   // return true if there is ":" before "#", "?", and "/"
   return ((colonIndex >0) && (colonIndex<index));
   
 }
 
 /**
  * Return true if the local path is an absolute path.
  *
  * @param systemId The path string
  * @return true if the path is absolute
  */
 public static boolean isAbsolutePath(String systemId)
 {
   if(systemId == null)
       return false;
   final File file = new File(systemId);
   return file.isAbsolute();
   
 }
 
  /**
  * Return true if the local path is a Windows absolute path.
  *
  * @param systemId The path string
  * @return true if the path is a Windows absolute path
  */
   private static boolean isWindowsAbsolutePath(String systemId)
 {
   if(!isAbsolutePath(systemId))
     return false;
   // On Windows, an absolute path starts with "[drive_letter]:\".
   if (systemId.length() > 2 
       && systemId.charAt(1) == ":"
       && Character.isLetter(systemId.charAt(0))
       && (systemId.charAt(2) == "\\" || systemId.charAt(2) == "/"))
     return true;
   else
     return false;
 }
 
 /**
  * Replace spaces with "%20" and backslashes with forward slashes in 
  * the input string to generate a well-formed URI string.
  *
  * @param str The input string
  * @return The string after conversion
  */
 private static String replaceChars(String str)
 {
   StringBuffer buf = new StringBuffer(str);
   int length = buf.length();
   for (int i = 0; i < length; i++)
   {
     char currentChar = buf.charAt(i);
     // Replace space with "%20"
     if (currentChar == " ")
     {
       buf.setCharAt(i, "%");
       buf.insert(i+1, "20");
       length = length + 2;
       i = i + 2;
     }
     // Replace backslash with forward slash
     else if (currentChar == "\\")
     {
       buf.setCharAt(i, "/");
     }
   }
   
   return buf.toString();
 }
 
 /**
  * Take a SystemID string and try to turn it into a good absolute URI.
  *
  * @param systemId A URI string, which may be absolute or relative.
  *
  * @return The resolved absolute URI
  */
 public static String getAbsoluteURI(String systemId)
 {
   String absoluteURI = systemId;
   if (isAbsoluteURI(systemId))
   {
     // Only process the systemId if it starts with "file:".
     if (systemId.startsWith("file:"))
     {
       String str = systemId.substring(5);
       
       // Resolve the absolute path if the systemId starts with "file:///"
       // or "file:/". Don"t do anything if it only starts with "file://".
       if (str != null && str.startsWith("/"))
       {
         if (str.startsWith("///") || !str.startsWith("//"))
         {
           // A Windows path containing a drive letter can be relative.
           // A Unix path starting with "file:/" is always absolute.
           int secondColonIndex = systemId.indexOf(":", 5);
           if (secondColonIndex > 0)
           {
             String localPath = systemId.substring(secondColonIndex-1);
             try {
               if (!isAbsolutePath(localPath))
                 absoluteURI = systemId.substring(0, secondColonIndex-1) + 
                               getAbsolutePathFromRelativePath(localPath);
             }
             catch (SecurityException se) {
               return systemId;
             }
           }
         }          
       }
       else
       {
         return getAbsoluteURIFromRelative(systemId.substring(5));
       }
               
       return replaceChars(absoluteURI);
     }
     else
       return systemId;
   }
   else
     return getAbsoluteURIFromRelative(systemId);
   
 }


}


 </source>
   
  
 
  



Return the first element child with the specified qualified name.

   <source lang="java">

/**

* 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.
*/

import java.io.OutputStream; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Element; import org.w3c.dom.Node; /**

* Few simple utils to read DOM. This is originally from the Jakarta Commons
* Modeler.
* 
* @author Costin Manolache
*/

public class Utils {

 /**
  * Return the first element child with the specified qualified name.
  * 
  * @param parent
  * @param ns
  * @param lp
  * @return
  */
 public static Element getFirstChildWithName(Element parent, String ns, String lp) {
     for (Node n = parent.getFirstChild(); n != null; n = n.getNextSibling()) {
         if (n instanceof Element) {
             Element e = (Element)n;
             String ens = (e.getNamespaceURI() == null) ? "" : e.getNamespaceURI();
             if (ns.equals(ens) && lp.equals(e.getLocalName())) {
                 return e;
             }
         }
     }
     return null;
 }

}

 </source>
   
  
 
  



Use JAXP Validation API to create a validator and validate input from a DOM which contains inline schemas and multiple validation roots.

   <source lang="java">

/*

* 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.
*/

import java.io.PrintWriter; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Vector; import javax.xml.XMLConstants; import javax.xml.namespace.NamespaceContext; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Source; import javax.xml.transform.dom.DOMSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.SAXParseException; /**

*

* A sample demonstrating how to use the JAXP 1.3 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. *

* 
*

* This class is useful as a "poor-man"s" performance tester to compare the * speed of various JAXP 1.3 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. *

* 
*

* Note: The results produced by this program should never be * accepted as true performance measurements. *

* 
* @author Michael Glavassevich, IBM
* 
* @version $Id: InlineSchemaValidator.java 447685 2006-09-19 02:37:49Z mrglavas $
*/

public class InlineSchemaValidator implements ErrorHandler, NamespaceContext {

 //
 // Constants
 //
 // feature ids
 /**
  * Schema full checking feature id
  * (http://apache.org/xml/features/validation/schema-full-checking).
  */
 protected static final String SCHEMA_FULL_CHECKING_FEATURE_ID = "http://apache.org/xml/features/validation/schema-full-checking";
 /**
  * Honour all schema locations feature id
  * (http://apache.org/xml/features/honour-all-schemaLocations).
  */
 protected static final String HONOUR_ALL_SCHEMA_LOCATIONS_ID = "http://apache.org/xml/features/honour-all-schemaLocations";
 /**
  * Validate schema annotations feature id
  * (http://apache.org/xml/features/validate-annotations)
  */
 protected static final String VALIDATE_ANNOTATIONS_ID = "http://apache.org/xml/features/validate-annotations";
 /**
  * Generate synthetic schema annotations feature id
  * (http://apache.org/xml/features/generate-synthetic-annotations).
  */
 protected static final String GENERATE_SYNTHETIC_ANNOTATIONS_ID = "http://apache.org/xml/features/generate-synthetic-annotations";
 // default settings
 /** Default schema language (http://www.w3.org/2001/XMLSchema). */
 protected static final String DEFAULT_SCHEMA_LANGUAGE = XMLConstants.W3C_XML_SCHEMA_NS_URI;
 /** Default repetition (1). */
 protected static final int DEFAULT_REPETITION = 1;
 /** Default schema full checking support (false). */
 protected static final boolean DEFAULT_SCHEMA_FULL_CHECKING = false;
 /** Default honour all schema locations (false). */
 protected static final boolean DEFAULT_HONOUR_ALL_SCHEMA_LOCATIONS = false;
 /** Default validate schema annotations (false). */
 protected static final boolean DEFAULT_VALIDATE_ANNOTATIONS = false;
 /** Default generate synthetic schema annotations (false). */
 protected static final boolean DEFAULT_GENERATE_SYNTHETIC_ANNOTATIONS = false;
 /** Default memory usage report (false). */
 protected static final boolean DEFAULT_MEMORY_USAGE = false;
 //
 // Data
 //
 /** Print writer. */
 protected PrintWriter fOut = new PrintWriter(System.out);
 /** Prefix to URI mappings for the NamespaceContext. */
 protected HashMap fPrefixToURIMappings;
 /** URI to prefix mappings for the NamespaceContext. */
 protected HashMap fURIToPrefixMappings;
 //
 // Constructors
 //
 public InlineSchemaValidator(HashMap prefixToURIMappings, HashMap uriToPrefixMappings) {
   fPrefixToURIMappings = prefixToURIMappings;
   fURIToPrefixMappings = uriToPrefixMappings;
 } // <init>(HashMap,HashMap)
 //
 // Public methods
 //
 public void validate(Validator validator, Source source, String systemId, int repetitions,
     boolean memoryUsage) {
   try {
     long timeBefore = System.currentTimeMillis();
     long memoryBefore = Runtime.getRuntime().freeMemory();
     for (int j = 0; j < repetitions; ++j) {
       validator.validate(source);
     }
     long memoryAfter = Runtime.getRuntime().freeMemory();
     long timeAfter = System.currentTimeMillis();
     long time = timeAfter - timeBefore;
     long memory = memoryUsage ? memoryBefore - memoryAfter : Long.MIN_VALUE;
     printResults(fOut, systemId, time, memory, repetitions);
   } catch (SAXParseException e) {
     // ignore
   } catch (Exception e) {
     System.err.println("error: Parse error occurred - " + e.getMessage());
     Exception se = e;
     if (e instanceof SAXException) {
       se = ((SAXException) e).getException();
     }
     if (se != null)
       se.printStackTrace(System.err);
     else
       e.printStackTrace(System.err);
   }
 } // validate(Validator,Source,String,int,boolean)
 /** Prints the results. */
 public void printResults(PrintWriter out, String uri, long time, long memory, int repetition) {
   // filename.xml: 631 ms
   out.print(uri);
   out.print(": ");
   if (repetition == 1) {
     out.print(time);
   } else {
     out.print(time);
     out.print("/");
     out.print(repetition);
     out.print("=");
     out.print(((float) time) / repetition);
   }
   out.print(" ms");
   if (memory != Long.MIN_VALUE) {
     out.print(", ");
     out.print(memory);
     out.print(" bytes");
   }
   out.println();
   out.flush();
 } // printResults(PrintWriter,String,long,long,int)
 //
 // ErrorHandler methods
 //
 /** Warning. */
 public void warning(SAXParseException ex) throws SAXException {
   printError("Warning", ex);
 } // warning(SAXParseException)
 /** Error. */
 public void error(SAXParseException ex) throws SAXException {
   printError("Error", ex);
 } // error(SAXParseException)
 /** Fatal error. */
 public void fatalError(SAXParseException ex) throws SAXException {
   printError("Fatal Error", ex);
   throw ex;
 } // fatalError(SAXParseException)
 //
 // NamespaceContext methods
 //
 public String getNamespaceURI(String prefix) {
   if (prefix == null) {
     throw new IllegalArgumentException("Prefix cannot be null.");
   } else if (XMLConstants.XML_NS_PREFIX.equals(prefix)) {
     return XMLConstants.XML_NS_URI;
   } else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix)) {
     return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
   } else if (fPrefixToURIMappings != null) {
     String uri = (String) fPrefixToURIMappings.get(prefix);
     if (uri != null) {
       return uri;
     }
   }
   return XMLConstants.NULL_NS_URI;
 } // getNamespaceURI(String)
 public String getPrefix(String namespaceURI) {
   if (namespaceURI == null) {
     throw new IllegalArgumentException("Namespace URI cannot be null.");
   } else if (XMLConstants.XML_NS_URI.equals(namespaceURI)) {
     return XMLConstants.XML_NS_PREFIX;
   } else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI)) {
     return XMLConstants.XMLNS_ATTRIBUTE;
   } else if (fURIToPrefixMappings != null) {
     HashSet prefixes = (HashSet) fURIToPrefixMappings.get(namespaceURI);
     if (prefixes != null && prefixes.size() > 0) {
       return (String) prefixes.iterator().next();
     }
   }
   return null;
 } // getPrefix(String)
 public Iterator getPrefixes(String namespaceURI) {
   if (namespaceURI == null) {
     throw new IllegalArgumentException("Namespace URI cannot be null.");
   } else if (XMLConstants.XML_NS_URI.equals(namespaceURI)) {
     return new Iterator() {
       boolean more = true;
       public boolean hasNext() {
         return more;
       }
       public Object next() {
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
         more = false;
         return XMLConstants.XML_NS_PREFIX;
       }
       public void remove() {
         throw new UnsupportedOperationException();
       }
     };
   } else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI)) {
     return new Iterator() {
       boolean more = true;
       public boolean hasNext() {
         return more;
       }
       public Object next() {
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
         more = false;
         return XMLConstants.XMLNS_ATTRIBUTE;
       }
       public void remove() {
         throw new UnsupportedOperationException();
       }
     };
   } else if (fURIToPrefixMappings != null) {
     HashSet prefixes = (HashSet) fURIToPrefixMappings.get(namespaceURI);
     if (prefixes != null && prefixes.size() > 0) {
       return prefixes.iterator();
     }
   }
   return Collections.EMPTY_LIST.iterator();
 } // getPrefixes(String)
 //
 // Protected methods
 //
 /** Prints the error message. */
 protected void printError(String type, SAXParseException ex) {
   System.err.print("[");
   System.err.print(type);
   System.err.print("] ");
   String systemId = ex.getSystemId();
   if (systemId != null) {
     int index = systemId.lastIndexOf("/");
     if (index != -1)
       systemId = systemId.substring(index + 1);
     System.err.print(systemId);
   }
   System.err.print(":");
   System.err.print(ex.getLineNumber());
   System.err.print(":");
   System.err.print(ex.getColumnNumber());
   System.err.print(": ");
   System.err.print(ex.getMessage());
   System.err.println();
   System.err.flush();
 } // printError(String,SAXParseException)
 //
 // MAIN
 //
 /** Main program entry point. */
 public static void main(String[] argv) {
   // is there anything to do?
   if (argv.length == 0) {
     printUsage();
     System.exit(1);
   }
   // variables
   Vector schemas = null;
   Vector instances = null;
   HashMap prefixMappings = null;
   HashMap uriMappings = null;
   String docURI = argv[argv.length - 1];
   String schemaLanguage = DEFAULT_SCHEMA_LANGUAGE;
   int repetition = DEFAULT_REPETITION;
   boolean schemaFullChecking = DEFAULT_SCHEMA_FULL_CHECKING;
   boolean honourAllSchemaLocations = DEFAULT_HONOUR_ALL_SCHEMA_LOCATIONS;
   boolean validateAnnotations = DEFAULT_VALIDATE_ANNOTATIONS;
   boolean generateSyntheticAnnotations = DEFAULT_GENERATE_SYNTHETIC_ANNOTATIONS;
   boolean memoryUsage = DEFAULT_MEMORY_USAGE;
   // process arguments
   for (int i = 0; i < argv.length - 1; ++i) {
     String arg = argv[i];
     if (arg.startsWith("-")) {
       String option = arg.substring(1);
       if (option.equals("l")) {
         // get schema language name
         if (++i == argv.length) {
           System.err.println("error: Missing argument to -l option.");
         } else {
           schemaLanguage = argv[i];
         }
         continue;
       }
       if (option.equals("x")) {
         if (++i == argv.length) {
           System.err.println("error: Missing argument to -x option.");
           continue;
         }
         String number = argv[i];
         try {
           int value = Integer.parseInt(number);
           if (value < 1) {
             System.err.println("error: Repetition must be at least 1.");
             continue;
           }
           repetition = value;
         } catch (NumberFormatException e) {
           System.err.println("error: invalid number (" + number + ").");
         }
         continue;
       }
       if (arg.equals("-a")) {
         // process -a: xpath expressions for schemas
         if (schemas == null) {
           schemas = new Vector();
         }
         while (i + 1 < argv.length - 1 && !(arg = argv[i + 1]).startsWith("-")) {
           schemas.add(arg);
           ++i;
         }
         continue;
       }
       if (arg.equals("-i")) {
         // process -i: xpath expressions for instance documents
         if (instances == null) {
           instances = new Vector();
         }
         while (i + 1 < argv.length - 1 && !(arg = argv[i + 1]).startsWith("-")) {
           instances.add(arg);
           ++i;
         }
         continue;
       }
       if (arg.equals("-nm")) {
         String prefix;
         String uri;
         while (i + 2 < argv.length - 1 && !(prefix = argv[i + 1]).startsWith("-")
             && !(uri = argv[i + 2]).startsWith("-")) {
           if (prefixMappings == null) {
             prefixMappings = new HashMap();
             uriMappings = new HashMap();
           }
           prefixMappings.put(prefix, uri);
           HashSet prefixes = (HashSet) uriMappings.get(uri);
           if (prefixes == null) {
             prefixes = new HashSet();
             uriMappings.put(uri, prefixes);
           }
           prefixes.add(prefix);
           i += 2;
         }
         continue;
       }
       if (option.equalsIgnoreCase("f")) {
         schemaFullChecking = option.equals("f");
         continue;
       }
       if (option.equalsIgnoreCase("hs")) {
         honourAllSchemaLocations = option.equals("hs");
         continue;
       }
       if (option.equalsIgnoreCase("va")) {
         validateAnnotations = option.equals("va");
         continue;
       }
       if (option.equalsIgnoreCase("ga")) {
         generateSyntheticAnnotations = option.equals("ga");
         continue;
       }
       if (option.equalsIgnoreCase("m")) {
         memoryUsage = option.equals("m");
         continue;
       }
       if (option.equals("h")) {
         printUsage();
         continue;
       }
       System.err.println("error: unknown option (" + option + ").");
       continue;
     }
   }
   try {
     // Create new instance of inline schema validator.
     InlineSchemaValidator inlineSchemaValidator = new InlineSchemaValidator(prefixMappings,
         uriMappings);
     // Parse document containing schemas and validation roots
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     dbf.setNamespaceAware(true);
     DocumentBuilder db = dbf.newDocumentBuilder();
     db.setErrorHandler(inlineSchemaValidator);
     Document doc = db.parse(docURI);
     // Create XPath factory for selecting schema and validation roots
     XPathFactory xpf = XPathFactory.newInstance();
     XPath xpath = xpf.newXPath();
     xpath.setNamespaceContext(inlineSchemaValidator);
     // Select schema roots from the DOM
     NodeList[] schemaNodes = new NodeList[schemas != null ? schemas.size() : 0];
     for (int i = 0; i < schemaNodes.length; ++i) {
       XPathExpression xpathSchema = xpath.rupile((String) schemas.elementAt(i));
       schemaNodes[i] = (NodeList) xpathSchema.evaluate(doc, XPathConstants.NODESET);
     }
     // Select validation roots from the DOM
     NodeList[] instanceNodes = new NodeList[instances != null ? instances.size() : 0];
     for (int i = 0; i < instanceNodes.length; ++i) {
       XPathExpression xpathInstance = xpath.rupile((String) instances.elementAt(i));
       instanceNodes[i] = (NodeList) xpathInstance.evaluate(doc, XPathConstants.NODESET);
     }
     // Create SchemaFactory and configure
     SchemaFactory factory = SchemaFactory.newInstance(schemaLanguage);
     factory.setErrorHandler(inlineSchemaValidator);
     try {
       factory.setFeature(SCHEMA_FULL_CHECKING_FEATURE_ID, schemaFullChecking);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: SchemaFactory does not recognize feature ("
           + SCHEMA_FULL_CHECKING_FEATURE_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: SchemaFactory does not support feature ("
           + SCHEMA_FULL_CHECKING_FEATURE_ID + ")");
     }
     try {
       factory.setFeature(HONOUR_ALL_SCHEMA_LOCATIONS_ID, honourAllSchemaLocations);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: SchemaFactory does not recognize feature ("
           + HONOUR_ALL_SCHEMA_LOCATIONS_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: SchemaFactory does not support feature ("
           + HONOUR_ALL_SCHEMA_LOCATIONS_ID + ")");
     }
     try {
       factory.setFeature(VALIDATE_ANNOTATIONS_ID, validateAnnotations);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: SchemaFactory does not recognize feature ("
           + VALIDATE_ANNOTATIONS_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: SchemaFactory does not support feature ("
           + VALIDATE_ANNOTATIONS_ID + ")");
     }
     try {
       factory.setFeature(GENERATE_SYNTHETIC_ANNOTATIONS_ID, generateSyntheticAnnotations);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: SchemaFactory does not recognize feature ("
           + GENERATE_SYNTHETIC_ANNOTATIONS_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: SchemaFactory does not support feature ("
           + GENERATE_SYNTHETIC_ANNOTATIONS_ID + ")");
     }
     // Build Schema from sources
     Schema schema;
     {
       DOMSource[] sources;
       int size = 0;
       for (int i = 0; i < schemaNodes.length; ++i) {
         size += schemaNodes[i].getLength();
       }
       sources = new DOMSource[size];
       if (size == 0) {
         schema = factory.newSchema();
       } else {
         int count = 0;
         for (int i = 0; i < schemaNodes.length; ++i) {
           NodeList nodeList = schemaNodes[i];
           int nodeListLength = nodeList.getLength();
           for (int j = 0; j < nodeListLength; ++j) {
             sources[count++] = new DOMSource(nodeList.item(j));
           }
         }
         schema = factory.newSchema(sources);
       }
     }
     // Setup validator and input source.
     Validator validator = schema.newValidator();
     validator.setErrorHandler(inlineSchemaValidator);
     try {
       validator.setFeature(SCHEMA_FULL_CHECKING_FEATURE_ID, schemaFullChecking);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: Validator does not recognize feature ("
           + SCHEMA_FULL_CHECKING_FEATURE_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: Validator does not support feature ("
           + SCHEMA_FULL_CHECKING_FEATURE_ID + ")");
     }
     try {
       validator.setFeature(HONOUR_ALL_SCHEMA_LOCATIONS_ID, honourAllSchemaLocations);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: Validator does not recognize feature ("
           + HONOUR_ALL_SCHEMA_LOCATIONS_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: Validator does not support feature ("
           + HONOUR_ALL_SCHEMA_LOCATIONS_ID + ")");
     }
     try {
       validator.setFeature(VALIDATE_ANNOTATIONS_ID, validateAnnotations);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: Validator does not recognize feature ("
           + VALIDATE_ANNOTATIONS_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: Validator does not support feature ("
           + VALIDATE_ANNOTATIONS_ID + ")");
     }
     try {
       validator.setFeature(GENERATE_SYNTHETIC_ANNOTATIONS_ID, generateSyntheticAnnotations);
     } catch (SAXNotRecognizedException e) {
       System.err.println("warning: Validator does not recognize feature ("
           + GENERATE_SYNTHETIC_ANNOTATIONS_ID + ")");
     } catch (SAXNotSupportedException e) {
       System.err.println("warning: Validator does not support feature ("
           + GENERATE_SYNTHETIC_ANNOTATIONS_ID + ")");
     }
     // Validate instance documents
     for (int i = 0; i < instanceNodes.length; ++i) {
       NodeList nodeList = instanceNodes[i];
       int nodeListLength = nodeList.getLength();
       for (int j = 0; j < nodeListLength; ++j) {
         DOMSource source = new DOMSource(nodeList.item(j));
         source.setSystemId(docURI);
         inlineSchemaValidator.validate(validator, source, docURI, repetition, memoryUsage);
       }
     }
   } catch (SAXParseException e) {
     // ignore
   } catch (Exception e) {
     System.err.println("error: Parse error occurred - " + e.getMessage());
     if (e instanceof SAXException) {
       Exception nested = ((SAXException) e).getException();
       if (nested != null) {
         e = nested;
       }
     }
     e.printStackTrace(System.err);
   }
 } // main(String[])
 //
 // Private static methods
 //
 /** Prints the usage. */
 private static void printUsage() {
   System.err.println("usage: java jaxp.InlineSchemaValidator (options) uri ...");
   System.err.println();
   System.err.println("options:");
   System.err.println("  -l name          Select schema language by name.");
   System.err.println("  -x number        Select number of repetitions.");
   System.err.println("  -a xpath    ...  Provide a list of XPath expressions for schema roots");
   System.err
       .println("  -i xpath    ...  Provide a list of XPath expressions for validation roots");
   System.err
       .println("  -nm pre uri ...  Provide a list of prefix to namespace URI mappings for the XPath expressions.");
   System.err.println("  -f  | -F         Turn on/off Schema full checking.");
   System.err
       .println("                   NOTE: Not supported by all schema factories and validators.");
   System.err.println("  -hs | -HS        Turn on/off honouring of all schema locations.");
   System.err
       .println("                   NOTE: Not supported by all schema factories and validators.");
   System.err.println("  -va | -VA        Turn on/off validation of schema annotations.");
   System.err
       .println("                   NOTE: Not supported by all schema factories and validators.");
   System.err
       .println("  -ga | -GA        Turn on/off generation of synthetic schema annotations.");
   System.err
       .println("                   NOTE: Not supported by all schema factories and validators.");
   System.err.println("  -m  | -M         Turn on/off memory usage report");
   System.err.println("  -h               This help screen.");
   System.err.println();
   System.err.println("defaults:");
   System.err.println("  Schema language:                 " + DEFAULT_SCHEMA_LANGUAGE);
   System.err.println("  Repetition:                      " + DEFAULT_REPETITION);
   System.err.print("  Schema full checking:            ");
   System.err.println(DEFAULT_SCHEMA_FULL_CHECKING ? "on" : "off");
   System.err.print("  Honour all schema locations:     ");
   System.err.println(DEFAULT_HONOUR_ALL_SCHEMA_LOCATIONS ? "on" : "off");
   System.err.print("  Validate annotations:            ");
   System.err.println(DEFAULT_VALIDATE_ANNOTATIONS ? "on" : "off");
   System.err.print("  Generate synthetic annotations:  ");
   System.err.println(DEFAULT_GENERATE_SYNTHETIC_ANNOTATIONS ? "on" : "off");
   System.err.print("  Memory:                          ");
   System.err.println(DEFAULT_MEMORY_USAGE ? "on" : "off");
   System.err.println();
   System.err.println("notes:");
   System.err
       .println("  The speed and memory results from this program should NOT be used as the");
   System.err
       .println("  basis of parser performance comparison! Real analytical methods should be");
   System.err
       .println("  used. For better results, perform multiple document validations within the");
   System.err
       .println("  same virtual machine to remove class loading from parse time and memory usage.");
 } // printUsage()

} // class InlineSchemaValidator

 </source>
   
  
 
  



Validate xml against the schema

   <source lang="java">
   

import org.apache.xerces.parsers.DOMParser; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; public class SchemaParserXerces implements ErrorHandler {

 public void warning(SAXParseException e) throws SAXException {
   throw e;
 }
 public void error(SAXParseException e) throws SAXException {
   throw e;
 }
 public void fatalError(SAXParseException e) throws SAXException {
   throw e;
 }
 public static void main(String[] args) throws Exception {
   DOMParser d = new DOMParser();
   d.setFeature("http://xml.org/sax/features/validation", true);
   d.setFeature("http://apache.org/xml/features/validation/schema", true);
   d.setFeature("http://apache.org/xml/features/validation/schema-full-checking", true);
   d.setErrorHandler(new SchemaParserXerces());
   d.parse(args[0]);
   System.out.println("Parsed successfully");
 }

}


 </source>
   
  
 
  



Validate xml against XML Schema

   <source lang="java">
  

/* Parser object is: com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl@c9ba38 Start document: Start element: local name: PHONEBOOK qname: PHONEBOOK uri: Characters: Start element: local name: PERSON qname: PERSON uri: Characters: Start element: local name: NAME qname: NAME uri: Attributes:

 Name : firstName
 Type : CDATA
 Value: Joe
 Name : lastName
 Type : CDATA
 Value: Yin

Characters: Joe Characters: Yin End element: local name: NAME qname: NAME uri: Characters: Start element: local name: EMAIL qname: EMAIL uri: Characters: joe@yourserver.ru End element: local name: EMAIL qname: EMAIL uri: Characters: Start element: local name: TELEPHONE qname: TELEPHONE uri: Characters: 202-999-9999 End element: local name: TELEPHONE qname: TELEPHONE uri: Characters: Start element: local name: WEB qname: WEB uri: Characters: www.jexp.ru End element: local name: WEB qname: WEB uri: Characters: End element: local name: PERSON qname: PERSON uri: Characters: End element: local name: PHONEBOOK qname: PHONEBOOK uri: End document:

*/

import java.io.StringReader; import javax.xml.XMLConstants; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.sax.SAXSource; import javax.xml.validation.SchemaFactory; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.DefaultHandler; public class MainClass {

 public static void main(String args[])throws Exception {
   SAXParserFactory spf = SAXParserFactory.newInstance();
   SAXParser parser = null;
   spf.setNamespaceAware(true);
   try {
    SchemaFactory sf =
                    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    spf.setSchema(sf.newSchema(new SAXSource(new InputSource(new StringReader(schemaString)))));
    parser = spf.newSAXParser();
   }
   catch(SAXException e) {
     e.printStackTrace(System.err);
     System.exit(1);    
   } 
   catch(ParserConfigurationException e) {
     e.printStackTrace(System.err);
     System.exit(1);    
   }
   MySAXHandler handler = new MySAXHandler(); 
   System.out.println(schemaString);
   parser.parse(new InputSource(new StringReader(xmlString)), handler);
 }
 static String xmlString = "<?xml version=\"1.0\"?>" +
     "<note>" +
     "<to>rtoName</to>" +
     "<from>FromName</from>" +
     "<heading>Info</heading>" +
     "<body>Message Body</body>" +
     "</note>";
 
 static String schemaString ="<?xml version=\"1.0\"?>" +
     "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"" +
     " targetNamespace=\"http://www.jexp.ru\"" +
     " xmlns=\"http://www.jexp.ru\"" +
     " elementFormDefault=\"qualified\">" +
     "<xs:element name=\"note\">" +
     "<xs:complexType>" +
     "<xs:sequence>" +
     "<xs:element name=\"to\" type=\"xs:string\"/>" +
     "<xs:element name=\"from\" type=\"xs:string\"/>" +
     "<xs:element name=\"heading\" type=\"xs:string\"/>" +
     "<xs:element name=\"body\" type=\"xs:string\"/>" +
     "</xs:sequence>" +
                     "</xs:complexType>" +
                     "</xs:element>" +
                     "</xs:schema>";

} class MySAXHandler extends DefaultHandler {

 public void startDocument() {
   System.out.println("Start document: ");
 }    
   public void endDocument()  {
   System.out.println("End document: ");
 }
 
 public void startElement(String uri, String localName, String qname, 
                                                              Attributes attr)
 {
   System.out.println("Start element: local name: " + localName + " qname: " 
                                                       + qname + " uri: "+uri);
   int attrCount = attr.getLength();
   if(attrCount>0) {
     System.out.println("Attributes:"); 
     for(int i = 0 ; i<attrCount ; i++) {
       System.out.println("  Name : " + attr.getQName(i)); 
       System.out.println("  Type : " + attr.getType(i)); 
       System.out.println("  Value: " + attr.getValue(i)); 
     }
   } 
 }
 
 public void endElement(String uri, String localName, String qname) {
   System.out.println("End element: local name: " + localName + " qname: "
                                                        + qname + " uri: "+uri);
 }
 
 public void characters(char[] ch, int start, int length) {
   System.out.println("Characters: " + new String(ch, start, length));
 }
 public void ignorableWhitespace(char[] ch, int start, int length) {
   System.out.println("Ignorable whitespace: " + new String(ch, start, length));
 }
 public void startPrefixMapping(String prefix, String uri) {
   System.out.println("Start \"" + prefix + "\" namespace scope. URI: " + uri); 
 }
 public void endPrefixMapping(String prefix) {
   System.out.println("End \"" + prefix + "\" namespace scope."); 
 }
 public void warning(SAXParseException spe) {
   System.out.println("Warning at line "+spe.getLineNumber());
   System.out.println(spe.getMessage());
 }
 public void fatalError(SAXParseException spe) throws SAXException {
   System.out.println("Fatal error at line "+spe.getLineNumber());
   System.out.println(spe.getMessage());
   throw spe;
 }

}



 </source>
   
  
 
  



XML constants

   <source lang="java">
 

// Revised from act soap import javax.xml.namespace.QName; import javax.xml.soap.*; public class TMConstants {

 public static final String ENCODING_MECHANISMTYPE = "ACT SAAJ";
 public static final String NS_PREFIX_WSDL = "wsdl";
 public static final String NS_URI_WSDL = "http://schemas.xmlsoap.org/wsdl/";
 
 public static final String NS_XSI_TYPE_PREFIX = "xsi";
 public static final String NS_XSI_TYPE_LOCALNAME = "type";
 public static final String NS_XSI_NIL_LOCALNAME = "nil";
 public static final String ATTR_ARRAY_TYPE = "arrayType";
 public static final String URI_2001_SCHEMA_XSI =
     "http://www.w3.org/2001/XMLSchema-instance";
   public static final String URI_1999_SCHEMA_XSD =
     "http://www.w3.org/1999/XMLSchema";
 public static final String URI_2000_SCHEMA_XSD =
     "http://www.w3.org/2000/10/XMLSchema";
 public static final String URI_2001_SCHEMA_XSD =
     "http://www.w3.org/2001/XMLSchema";
 public static final String URI_DEFAULT_SCHEMA_XSD = URI_2001_SCHEMA_XSD;
 public static final String[] URIS_SCHEMA_XSD = {
     URI_2001_SCHEMA_XSD,
     URI_2000_SCHEMA_XSD,
     URI_1999_SCHEMA_XSD
 };
 public static final String URI_DEFAULT_SCHEMA_XSD_PREFIX = "xsd";
   public static final String URI_SOAP11_ENC =
     "http://schemas.xmlsoap.org/soap/encoding/";
 public static final String URI_SOAP12_ENC =
     "http://www.w3.org/2002/12/soap-encoding";
 public static final String URI_SOAP12_NOENC =
     "http://www.w3.org/2002/12/soap-envelope/encoding/none";
 public static final String URI_DEFAULT_SOAP_ENC = URI_SOAP11_ENC;
 public static final String NS_URI_XML =
     "http://www.w3.org/XML/1998/namespace";
 public static final String[] URIS_SOAP_ENC = {
     URI_SOAP11_ENC,
     URI_SOAP12_ENC,
 };
 public static final String URI_DEFAULT_SOAP_ENC_PREFIX = "soapenc";
 public static final String URI_LITERAL_ENC = "";
 public static final QName QNAME_LITERAL_ITEM = new QName(URI_LITERAL_ENC,
     "item");
 public static final String LITERAL_ITEM = "item";
   public static final String URI_ACT_SOAP = "http://act.buaa.edu.cn/encoding/";
 public static final String URI_ACT_SOAP_PREFIX = "actsoapenc";
   public static final QName XSD_STRING = new QName(URI_DEFAULT_SCHEMA_XSD,
     "string", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_BOOLEAN = new QName(URI_DEFAULT_SCHEMA_XSD,
     "boolean", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_DOUBLE = new QName(URI_DEFAULT_SCHEMA_XSD,
     "double", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_FLOAT = new QName(URI_DEFAULT_SCHEMA_XSD,
                                                 "float",
                                                 URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_INT = new QName(URI_DEFAULT_SCHEMA_XSD, "int",
                                               URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_INTEGER = new QName(URI_DEFAULT_SCHEMA_XSD,
     "integer", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_LONG = new QName(URI_DEFAULT_SCHEMA_XSD, "long",
                                                URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_SHORT = new QName(URI_DEFAULT_SCHEMA_XSD,
                                                 "short",
                                                 URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_BYTE = new QName(URI_DEFAULT_SCHEMA_XSD, "byte",
                                                URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_DECIMAL = new QName(URI_DEFAULT_SCHEMA_XSD,
     "decimal", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_BASE64 = new QName(URI_DEFAULT_SCHEMA_XSD,
     "base64Binary", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_HEXBIN = new QName(URI_DEFAULT_SCHEMA_XSD,
     "hexBinary", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_ANYTYPE = new QName(URI_DEFAULT_SCHEMA_XSD,
     "anyType", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_ANY = new QName(URI_DEFAULT_SCHEMA_XSD, "any",
                                               URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_QNAME = new QName(URI_DEFAULT_SCHEMA_XSD,
                                                 "QName",
                                                 URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_DATETIME = new QName(URI_DEFAULT_SCHEMA_XSD,
     "dateTime", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_DATE = new QName(URI_DEFAULT_SCHEMA_XSD, "date",
                                                URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_TIME = new QName(URI_DEFAULT_SCHEMA_XSD, "time",
                                                URI_DEFAULT_SCHEMA_XSD_PREFIX);
     public static final QName XSD_NORMALIZEDSTRING = new QName(
     URI_2001_SCHEMA_XSD, "normalizedString", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_TOKEN = new QName(URI_2001_SCHEMA_XSD, "token",
                                                 URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_UNSIGNEDLONG = new QName(URI_2001_SCHEMA_XSD,
     "unsignedLong", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_UNSIGNEDINT = new QName(URI_2001_SCHEMA_XSD,
     "unsignedInt", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_UNSIGNEDSHORT = new QName(URI_2001_SCHEMA_XSD,
     "unsignedShort", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_UNSIGNEDBYTE = new QName(URI_2001_SCHEMA_XSD,
     "unsignedByte", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_POSITIVEINTEGER = new QName(URI_2001_SCHEMA_XSD,
     "positiveInteger", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_NEGATIVEINTEGER = new QName(URI_2001_SCHEMA_XSD,
     "negativeInteger", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_NONNEGATIVEINTEGER = new QName(
     URI_2001_SCHEMA_XSD, "nonNegativeInteger", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_NONPOSITIVEINTEGER = new QName(
     URI_2001_SCHEMA_XSD, "nonPositiveInteger", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_YEARMONTH = new QName(URI_2001_SCHEMA_XSD,
     "gYearMonth", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_MONTHDAY = new QName(URI_2001_SCHEMA_XSD,
     "gMonthDay", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_YEAR = new QName(URI_2001_SCHEMA_XSD, "gYear",
                                                URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_MONTH = new QName(URI_2001_SCHEMA_XSD, "gMonth",
                                                 URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_DAY = new QName(URI_2001_SCHEMA_XSD, "gDay",
                                               URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_DURATION = new QName(URI_2001_SCHEMA_XSD,
     "duration", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_NAME = new QName(URI_2001_SCHEMA_XSD, "Name",
                                                URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_NCNAME = new QName(URI_2001_SCHEMA_XSD,
     "NCName", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_NMTOKEN = new QName(URI_2001_SCHEMA_XSD,
     "NMTOKEN", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_NMTOKENS = new QName(URI_2001_SCHEMA_XSD,
     "NMTOKENS", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_NOTATION = new QName(URI_2001_SCHEMA_XSD,
     "NOTATION", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_ENTITY = new QName(URI_2001_SCHEMA_XSD,
     "ENTITY", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_ENTITIES = new QName(URI_2001_SCHEMA_XSD,
     "ENTITIES", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_IDREF = new QName(URI_2001_SCHEMA_XSD, "IDREF",
                                                 URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_IDREFS = new QName(URI_2001_SCHEMA_XSD,
     "IDREFS", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_ANYURI = new QName(URI_2001_SCHEMA_XSD,
     "anyURI", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_LANGUAGE = new QName(URI_2001_SCHEMA_XSD,
     "language", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_ID = new QName(URI_2001_SCHEMA_XSD, "ID",
                                              URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XSD_SCHEMA = new QName(URI_2001_SCHEMA_XSD,
     "schema", URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName XML_LANG = new QName(URI_2001_SCHEMA_XSD, "lang",
                                                URI_DEFAULT_SCHEMA_XSD_PREFIX);
 public static final QName SOAP_BASE64 = new QName(URI_DEFAULT_SOAP_ENC,
     "base64", URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_BASE64BINARY = new QName(URI_DEFAULT_SOAP_ENC,
     "base64Binary", URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_STRING = new QName(URI_DEFAULT_SOAP_ENC,
     "string", URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_BOOLEAN = new QName(URI_DEFAULT_SOAP_ENC,
     "boolean", URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_DOUBLE = new QName(URI_DEFAULT_SOAP_ENC,
     "double", URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_FLOAT = new QName(URI_DEFAULT_SOAP_ENC,
     "float", URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_INT = new QName(URI_DEFAULT_SOAP_ENC, "int",
                                                URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_LONG = new QName(URI_DEFAULT_SOAP_ENC, "long",
                                                 URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_SHORT = new QName(URI_DEFAULT_SOAP_ENC,
     "short", URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_BYTE = new QName(URI_DEFAULT_SOAP_ENC, "byte",
                                                 URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_INTEGER = new QName(URI_DEFAULT_SOAP_ENC,
     "integer", URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_DECIMAL = new QName(URI_DEFAULT_SOAP_ENC,
     "decimal", URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_ARRAY = new QName(URI_DEFAULT_SOAP_ENC,
     "Array", URI_DEFAULT_SOAP_ENC_PREFIX);
 public static final QName SOAP_ARRAY12 = new QName(URI_SOAP12_ENC, "Array",
     URI_DEFAULT_SOAP_ENC_PREFIX);
   public static final QName QNAME_TYPE_COLLECTION = new QName(
     URI_ACT_SOAP, "collection", URI_ACT_SOAP_PREFIX);
 public static final QName QNAME_TYPE_LIST = new QName(URI_ACT_SOAP,
     "List", URI_ACT_SOAP_PREFIX);
 public static final QName QNAME_TYPE_ARRAY_LIST = new QName(
     URI_ACT_SOAP, "arrayList", URI_ACT_SOAP_PREFIX);
 public static final QName QNAME_TYPE_DATAHANDLER = new QName(URI_ACT_SOAP,
   "DataHandler", URI_ACT_SOAP_PREFIX);
 public static final QName SOAP_MAP = new QName(URI_ACT_SOAP, "Map",
                                                URI_ACT_SOAP_PREFIX);
 public static final QName SOAP_VECTOR = new QName(URI_ACT_SOAP,
     "Vector", URI_ACT_SOAP_PREFIX);
 public static final String ANYCONTENT = "_any";
 public static final QName QNAME_MAP_ITEM = new QName("", "item");
 public static final QName QNAME_MAP_KEY = new QName("", "key");
 public static final QName QNAME_MAP_VALUE = new QName("", "value");
 public static final String DEFAULT_ENCODINGSTYLE =
     "http://schemas.xmlsoap.org/soap/encoding/";
 
 public static final String SCHEMA = "schema";
 public static final String SCHEMA_COMPLEXTYPE = "complexType";
 public static final String SCHEMA_SIMPLETYPE = "simpleType";
 public static final String SCHEMA_RESTRICTION = "restriction";
 public static final String SCHEMA_BASE = "base";
 public static final String SCHEMA_NAME = "name";
 public static final String SCHEMA_SEQUENCE = "sequence";
 public static final String SCHEMA_ELEMENT = "element";
 public static final String SCHEMA_ITEM = "item";
 public static final String SCHEMA_MINOCCURS = "minOccurs";
 public static final String SCHEMA_MAXOCCURS = "maxOccurs";
 public static final String SCHEMA_UNBOUNDED = "unbounded";
 public static final String SCHEMA_0 = "0";
 public static final String SCHEMA_TYPE = "type";
 public static final String SCHEMA_ANYTYPE = URI_DEFAULT_SCHEMA_XSD_PREFIX +
     ":anyType";
 public static final String SCHEMA_NILLABLE = "nillable";
 public static final String TARGET_NAMESPACE = "targetNamespace";
 public static SOAPFactory SOAPFACTORY_INSTANCE = null;
 static {
   try {
     System.setProperty("javax.xml.soap.SOAPFactory",
                        "org.act.soap.message.ver1_1.SOAPFactory1_1Impl");
     SOAPFACTORY_INSTANCE = SOAPFactory.newInstance();
   }
   catch (Exception ex) {}
 }
 public static Name NAME_XSITYPE = null;
 static {
   try {
     NAME_XSITYPE = SOAPFACTORY_INSTANCE.createName(TMConstants.
         NS_XSI_TYPE_LOCALNAME,
         TMConstants.NS_XSI_TYPE_PREFIX,
         TMConstants.URI_2001_SCHEMA_XSI);
   }
   catch (Exception ex) {}
 }
 public static Name NAME_NIL = null;
 static {
   try {
     NAME_NIL = SOAPFACTORY_INSTANCE.createName(TMConstants.
                                                NS_XSI_NIL_LOCALNAME,
                                                TMConstants.NS_XSI_TYPE_PREFIX,
                                                TMConstants.
                                                URI_2001_SCHEMA_XSI);
   }
   catch (Exception ex) {}
 }
 public static Name NAME_SOAPENCARRAY_TYPE = null;
 static {
   try {
     NAME_SOAPENCARRAY_TYPE = SOAPFACTORY_INSTANCE.createName(
         TMConstants.ATTR_ARRAY_TYPE,
         TMConstants.URI_DEFAULT_SOAP_ENC_PREFIX,
         TMConstants.URI_DEFAULT_SOAP_ENC);
   }
   catch (Exception ex) {}
 }

}


 </source>