Skip to content

Commit 2f24c22

Browse files
committed
Play with XMLReader and full implemented Handler APIs.
1 parent 544974c commit 2f24c22

2 files changed

Lines changed: 203 additions & 0 deletions

File tree

Chapter15/SAXDemo.java

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
import java.io.FileReader;
2+
import java.io.IOException;
3+
4+
import org.xml.sax.XMLReader;
5+
import org.xml.sax.Attributes;
6+
import org.xml.sax.InputSource;
7+
import org.xml.sax.Locator;
8+
import org.xml.sax.SAXException;
9+
import org.xml.sax.SAXParseException;
10+
11+
import org.xml.sax.helpers.XMLReaderFactory;
12+
13+
import org.xml.sax.ext.DefaultHandler2;
14+
15+
public class SAXDemo{
16+
public static void main(String[] args) throws SAXException, IOException{
17+
if(args.length<1 || args.length>2){
18+
System.err.println("usage: java SAXDemo xmlFile [v]");
19+
return;
20+
}
21+
XMLReader xmlr = XMLReaderFactory.createXMLReader();
22+
if(args.length==2 && args[1].equalsIgnoreCase("v")){
23+
xmlr.setFeature("http://xml.org/sax/features/validation", true);
24+
}
25+
xmlr.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
26+
27+
Handler handler = new Handler();
28+
xmlr.setContentHandler(handler);
29+
xmlr.setDTDHandler(handler);
30+
xmlr.setEntityResolver(handler);
31+
xmlr.setErrorHandler(handler);
32+
xmlr.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
33+
34+
xmlr.parse(new InputSource(new FileReader(args[0])));
35+
}
36+
}
37+
38+
class Handler extends DefaultHandler2{
39+
private Locator locator;
40+
41+
@Override
42+
public void characters(char[] ch, int start, int length){
43+
System.out.print("characters() [");
44+
for(int i=start;i<start + length;i++){
45+
System.out.print(ch[i]);
46+
}
47+
System.out.println("]");
48+
}
49+
50+
@Override
51+
public void comment(char[] ch, int start, int length){
52+
System.out.print("comment() [");
53+
for(int i=start;i<start + length;i++){
54+
System.out.print(ch[i]);
55+
}
56+
System.out.println("]");
57+
}
58+
59+
@Override
60+
public void endCDATA(){
61+
System.out.println("endCDATA()");
62+
}
63+
64+
@Override
65+
public void endDocument(){
66+
System.out.println("endDocument()");
67+
}
68+
69+
@Override
70+
public void endDTD(){
71+
System.out.println("endDTD()");
72+
}
73+
74+
@Override
75+
public void endElement(String uri, String localName, String qName){
76+
System.out.print("endElement() ");
77+
System.out.print("uri=" + uri);
78+
System.out.print(", localName=" + localName);
79+
System.out.println(", qName=" + qName);
80+
}
81+
82+
@Override
83+
public void endEntity(String name){
84+
System.out.printf("endEntity() name=%s%n", name);
85+
}
86+
87+
@Override
88+
public void endPrefixMapping(String prefix){
89+
System.out.printf("endPrefixMapping() prefix=%s%n", prefix);
90+
}
91+
92+
@Override
93+
public void error(SAXParseException saxpe){
94+
System.out.println("error() " + saxpe);
95+
}
96+
97+
@Override
98+
public void fatalError(SAXParseException saxpe){
99+
System.out.println("fatalError() " + saxpe);
100+
}
101+
102+
@Override
103+
public void ignorableWhitespace(char[] ch, int start, int length){
104+
System.out.print("ignorableWhitespace() [");
105+
for(int i=start;i<start + length;i++){
106+
System.out.print(ch[i]);
107+
}
108+
System.out.println("]");
109+
}
110+
111+
@Override
112+
public void notationDecl(String name, String publicId, String systemId){
113+
System.out.printf("notationDecl() name=%1$s, publicId=%2$s, systemId=%3$s%n", name, publicId, systemId);
114+
}
115+
116+
@Override
117+
public void processingInstruction(String target, String data){
118+
System.out.printf("processingInstruction() target=%1$s, data=%2$s%n",
119+
target, data);
120+
}
121+
122+
@Override
123+
public InputSource resolveEntity(String publicId, String systemId){
124+
System.out.printf("resolveEntity() publicId=%1$s, systemId=%2$s%n",
125+
publicId, systemId);
126+
// Do not perform a remapping.
127+
InputSource is = new InputSource();
128+
is.setPublicId(publicId);
129+
is.setSystemId(systemId);
130+
return is;
131+
}
132+
133+
@Override
134+
public void setDocumentLocator(Locator locator){
135+
this.locator = locator;
136+
System.out.println("setDocumentLocator() locator=" + locator);
137+
}
138+
139+
@Override
140+
public void skippedEntity(String name){
141+
System.out.println("skippedEntity() name=" + name);
142+
}
143+
144+
@Override
145+
public void startCDATA(){
146+
System.out.println("startCDATA()");
147+
}
148+
149+
@Override
150+
public void startDocument(){
151+
System.out.println("startDocument()");
152+
}
153+
154+
@Override
155+
public void startDTD(String name, String publicId, String systemId){
156+
System.out.printf("startDTD() name=%1$s, publicId=%2$s, systemID=%3$s%n",
157+
name, publicId, systemId);
158+
}
159+
160+
@Override
161+
public void startElement(String uri, String localName, String qName, Attributes attributes){
162+
System.out.print("startElement() uri=" + uri);
163+
System.out.print(", localName=" + localName);
164+
System.out.println(", qName=" + qName);
165+
for(int i=0;i<attributes.getLength();i++){
166+
System.out.println("Attribute: " + attributes.getLocalName(i) + ", " + attributes.getValue(i));
167+
}
168+
// Explores the position of the element start.
169+
System.out.println("Column number=" + locator.getColumnNumber() + ", line number=" + locator.getLineNumber());
170+
}
171+
172+
@Override
173+
public void startEntity(String name){
174+
System.out.println("startEntity() name=" + name);
175+
}
176+
177+
@Override
178+
public void startPrefixMapping(String prefix, String uri){
179+
System.out.printf("startPrefixMapping() prefix=%1$s, uri=%2$s%n", prefix, uri);
180+
}
181+
182+
@Override
183+
public void unparsedEntityDecl(String name, String publicId, String systemId, String notationName){
184+
System.out.printf("unparsedEntityDecl() name=%1$s, publicId=%2$s, systemId=%3$s, notationName=%4$s%n");
185+
}
186+
187+
@Override
188+
public void warning(SAXParseException saxpe){
189+
System.out.println("warning() " + saxpe);
190+
}
191+
}

Chapter15/svg-examples.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0"?>
2+
<svg-example>
3+
<example>
4+
The following Scaleable Vector Graphics document describes a blue-filled and black-
5+
stroked rectangle.
6+
<![CDATA[<svg width="100%" height="100%" version="1.1"
7+
xmlns="http://www.w3.org/2000/svg">
8+
<rect width="300" height="100"
9+
style="fill:rgb(0,0,255);stroke-width:1; stroke:rgb(0,0,0)"/>
10+
</svg>]]>
11+
</example>
12+
</svg-example>

0 commit comments

Comments
 (0)