
leap.lang.xml.XmlReaderStax Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2012 the original author or authors.
*
* Licensed 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.
*/
package leap.lang.xml;
import leap.lang.io.IO;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.ProcessingInstruction;
import javax.xml.stream.events.XMLEvent;
import java.io.IOException;
import java.io.Reader;
import java.util.Iterator;
final class XmlReaderStax extends XmlReaderBase implements XmlReader {
private final Reader in;
private final XMLEventReader real;
private XMLEvent event;
public XmlReaderStax(Reader in) {
this(in,null);
}
public XmlReaderStax(Reader in,String sourceLocation) {
this.in = in;
this.real = XML.createEventReader(in);
if(null != sourceLocation){
this.source = sourceLocation;
}
}
@Override
public XMLEvent event() {
return event;
}
@Override
public boolean isCharacters() {
return event.isCharacters();
}
@Override
public String getCharacters() {
return event.asCharacters().getData();
}
public boolean isEndElement() {
return null != event && event.isEndElement();
}
public boolean isEndElement(QName name) {
return isEndElement() && event.asEndElement().getName().equals(name);
}
@Override
public boolean isProcessingInstruction() {
return null != event && event.isProcessingInstruction();
}
@Override
public boolean isProcessingInstruction(String target) {
return isProcessingInstruction() && getProcessingInstructionTarget().equals(target);
}
public boolean isStartElement() {
return null != event && event.isStartElement();
}
public boolean isStartElement(QName name) {
return isStartElement() && event.asStartElement().getName().equals(name);
}
public boolean isStartElement(String name) {
return isStartElement() && event.asStartElement().getName().getLocalPart().equals(name);
}
public boolean isEndElement(String name) {
return isEndElement() && event.asEndElement().getName().getLocalPart().equals(name);
}
public boolean isEndDocument() {
return null != event && event.isEndDocument();
}
public String getProcessingInstructionTarget() {
return ((ProcessingInstruction)event).getTarget();
}
public String getProcessingInstructionContent() {
return ((ProcessingInstruction)event).getData();
}
public QName getElementName() {
return event.asStartElement().getName();
}
public String getElementLocalName() {
return event.asStartElement().getName().getLocalPart();
}
@Override
@SuppressWarnings("unchecked")
public Iterator getAttributeLocalNames() {
final Iterator it = event.asStartElement().getAttributes();
return new Iterator() {
@Override
public boolean hasNext() {
return it.hasNext();
}
@Override
public String next() {
Attribute a = it.next();
return a.getName().getLocalPart();
}
};
}
@Override
public Iterator getAttributeNames() {
final Iterator it = event.asStartElement().getAttributes();
return new Iterator() {
@Override
public boolean hasNext() {
return it.hasNext();
}
@Override
public QName next() {
Attribute a = it.next();
return a.getName();
}
};
}
@Override
public boolean hasAttribute(QName name) {
return null == event ? false : event.asStartElement().getAttributeByName(name) != null;
}
@Override
@SuppressWarnings("rawtypes")
public boolean hasAttribute(String localName) {
if(null == event){
return false;
}
Iterator attrs = event.asStartElement().getAttributes();
while(attrs.hasNext()){
Attribute attr = (Attribute)attrs.next();
if(attr.getName().getLocalPart().equals(localName)){
return true;
}
}
return false;
}
@Override
public String doGetElementTextAndEnd() {
try {
return real.getElementText();
} catch (XMLStreamException e) {
throw new XmlException(e.getMessage(),e);
}
}
@Override
public String doGetAttribute(QName name) {
Attribute attr = attr(name);
return attr == null ? null : attr.getValue();
}
@Override
@SuppressWarnings("rawtypes")
public String doGetAttribute(String name) {
if(null == event){
return null;
}
Iterator attrs = event.asStartElement().getAttributes();
while(attrs.hasNext()){
Attribute attr = (Attribute)attrs.next();
if(attr.getName().getLocalPart().equals(name)){
return attr.getValue();
}
}
return null;
}
public boolean next() {
try {
if(real.hasNext()){
event = real.nextEvent();
return true;
}
return false;
} catch (XMLStreamException e) {
throw new XmlException(e.getMessage(),e);
}
}
@Override
public void close() throws IOException {
IO.close(in);
try {
real.close();
} catch (XMLStreamException e) {
throw new XmlException(e.getMessage(),e);
}
}
@Override
public int getLineNumber() {
return null == event ? -1 : event.getLocation().getLineNumber();
}
private Attribute attr(QName name){
return null == event ? null : event.asStartElement().getAttributeByName(name);
}
@Override
public String toString() {
return null == event ? "No event" : (event.getClass().getSimpleName() + " : " + event.toString());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy