001 package com.croftsoft.core.text.xml; 002 003 import java.io.*; 004 005 /********************************************************************* 006 * Filters out characters not permitted in XML. 007 * 008 * @see 009 * <a target="_blank" href="http://www.w3.org/TR/REC-xml#charsets"> 010 * Extensible Markup Language (XML) 1.0 (Second Edition), 011 * 2.2 Characters</a> 012 * 013 * @version 014 * 2002-09-24 015 * @since 016 * 2002-09-19 017 * @author 018 * <a href="https://www.croftsoft.com/">David Wallace Croft</a> 019 *********************************************************************/ 020 021 public final class XmlCharFilterReader 022 extends FilterReader 023 ////////////////////////////////////////////////////////////////////// 024 ////////////////////////////////////////////////////////////////////// 025 { 026 027 /********************************************************************* 028 * Main constructor. 029 *********************************************************************/ 030 public XmlCharFilterReader ( Reader in ) 031 ////////////////////////////////////////////////////////////////////// 032 { 033 super ( in ); 034 } 035 036 ////////////////////////////////////////////////////////////////////// 037 ////////////////////////////////////////////////////////////////////// 038 039 public int read ( ) 040 throws IOException 041 ////////////////////////////////////////////////////////////////////// 042 { 043 int ch; 044 045 while ( ( ch = super.read ( ) ) > -1 ) 046 { 047 if ( ( ch == 0x9 ) 048 || ( ch == 0xA ) 049 || ( ch == 0xD ) 050 || ( ( ch >= 0x00020 ) && ( ch <= 0x00D7FF ) ) 051 || ( ( ch >= 0x0E000 ) && ( ch <= 0x00FFFD ) ) 052 || ( ( ch >= 0x10000 ) && ( ch <= 0x10FFFF ) ) ) 053 { 054 return ch; 055 } 056 } 057 058 return -1; 059 } 060 061 public int read ( 062 char [ ] cbuf, 063 int off, 064 int len ) 065 throws IOException 066 ////////////////////////////////////////////////////////////////////// 067 { 068 int count = 0; 069 070 for ( int i = 0; i < len; i++ ) 071 { 072 int ch = read ( ); 073 074 if ( ch < 0 ) 075 { 076 return count > 0 ? count : -1; 077 } 078 079 cbuf [ off + count ] = ( char ) ch; 080 081 count++; 082 } 083 084 return len; 085 } 086 087 public int read ( char [ ] cbuf ) 088 throws IOException 089 ////////////////////////////////////////////////////////////////////// 090 { 091 return read ( cbuf, 0, cbuf.length ); 092 } 093 094 ////////////////////////////////////////////////////////////////////// 095 ////////////////////////////////////////////////////////////////////// 096 }