1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.bea.xml.stream;
17
18 import javax.xml.namespace.QName;
19 import com.bea.xml.stream.util.EmptyIterator;
20 import com.bea.xml.stream.util.ElementTypeNames;
21 import com.bea.xml.stream.filters.TypeFilter;
22 import javax.xml.stream.events.XMLEvent;
23 import javax.xml.stream.EventFilter;
24 import javax.xml.stream.events.StartElement;
25 import javax.xml.stream.events.EndElement;
26 import javax.xml.stream.events.Characters;
27 import javax.xml.stream.XMLStreamException;
28 import javax.xml.stream.XMLEventReader;
29 import javax.xml.stream.XMLInputFactory;
30
31 public class EventReaderFilter implements XMLEventReader {
32 private XMLEventReader parent;
33 private EventFilter filter;
34 public EventReaderFilter (XMLEventReader reader)
35 throws XMLStreamException
36 {
37 this.parent = reader;
38 }
39 public EventReaderFilter (XMLEventReader reader,
40 EventFilter filter)
41 throws XMLStreamException
42 {
43 this.parent = reader;
44 this.filter = filter;
45 }
46
47 public void setFilter(EventFilter filter) {
48 this.filter = filter;
49 }
50
51 public Object next() {
52 try {
53 return nextEvent();
54 } catch (XMLStreamException e) {
55 return null;
56 }
57 }
58
59 public XMLEvent nextEvent()
60 throws XMLStreamException
61 {
62 if (hasNext())
63 return parent.nextEvent();
64 return null;
65 }
66
67 public String getElementText()
68 throws XMLStreamException
69 {
70 StringBuffer buf = new StringBuffer();
71 XMLEvent e = nextEvent();
72 if (!e.isStartElement())
73 throw new XMLStreamException(
74 "Precondition for readText is"+
75 " nextEvent().getTypeEventType() == START_ELEMENT");
76 while(hasNext()) {
77 e = peek();
78 if(e.isStartElement())
79 throw new XMLStreamException("Unexpected Element start");
80 if(e.isCharacters())
81 buf.append(((Characters) e).getData());
82 if(e.isEndElement())
83 return buf.toString();
84 nextEvent();
85 }
86 throw new XMLStreamException("Unexpected end of Document");
87 }
88
89 public XMLEvent nextTag() throws XMLStreamException {
90 while(hasNext()) {
91 XMLEvent e = nextEvent();
92 if (e.isCharacters() && !((Characters) e).isWhiteSpace())
93 throw new XMLStreamException("Unexpected text");
94 if (e.isStartElement() || e.isEndElement())
95 return e;
96 }
97 throw new XMLStreamException("Unexpected end of Document");
98 }
99
100
101 public boolean hasNext()
102 {
103 try {
104 while(parent.hasNext()) {
105 if (filter.accept(parent.peek())) return true;
106 parent.nextEvent();
107 }
108 return false;
109 } catch (XMLStreamException e) {
110 return false;
111 }
112 }
113
114 public void remove() {
115 throw new UnsupportedOperationException();
116 }
117
118 public XMLEvent peek()
119 throws XMLStreamException
120 {
121 if (hasNext())
122 return parent.peek();
123 return null;
124 }
125
126 public void close()
127 throws XMLStreamException
128 {
129 parent.close();
130 }
131
132 public Object getProperty(String name) {
133 return parent.getProperty(name);
134 }
135
136 public static void main(String args[]) throws Exception {
137 System.setProperty("javax.xml.stream.XMLInputFactory",
138 "com.bea.xml.stream.MXParserFactory");
139 System.setProperty("javax.xml.stream.XMLEventFactory",
140 "com.bea.xml.stream.EventFactory");
141
142
143 /***
144 MXParser r = new MXParser();
145 r.setInput(new java.io.FileReader(args[0]));
146 XMLEventReaderBase b = new XMLEventReaderBase(r);
147 EventFilter f = new com.bea.xml.stream.filters.TypeFilter(XMLEvent.START_ELEMENT |
148 XMLEvent.END_ELEMENT);
149 EventReaderFilter filteredReader = new EventReaderFilter(b,f);
150
151 while (filteredReader.hasNext())
152 System.out.println(filteredReader.next());
153 **/
154
155 XMLInputFactory factory = XMLInputFactory.newInstance();
156
157 TypeFilter f = new com.bea.xml.stream.filters.TypeFilter();
158 f.addType(XMLEvent.START_ELEMENT);
159 f.addType(XMLEvent.END_ELEMENT);
160
161
162 XMLEventReader reader = factory.createFilteredReader(
163 factory.createXMLEventReader(new java.io.FileReader(args[0])),
164 f);
165
166 while(reader.hasNext())
167 System.out.println(reader.nextEvent());
168
169 }
170 }
171
172
173
174
175
176
177