This repository has been archived on 2025-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
citylimitsj/src/micropolisj/XML_Helper.java

137 lines
2.6 KiB
Java

package micropolisj;
import java.io.*;
import javax.xml.stream.*;
public class XML_Helper
{
private XML_Helper() {}
public static void skipToEndElement(XMLStreamReader in)
throws XMLStreamException
{
if (!in.isStartElement()) {
return;
}
int tagDepth = 1;
while (tagDepth > 0 && in.hasNext()) {
in.next();
if (in.isStartElement()) {
tagDepth++;
}
else if (in.isEndElement()) {
tagDepth--;
}
}
}
public static Reader readElementText(XMLStreamReader in)
{
return new ElementTextReader(in);
}
static class ElementTextReader extends Reader
{
XMLStreamReader xsr;
int tagDepth;
char [] buf;
int buf_start;
int buf_end;
ElementTextReader(XMLStreamReader xsr)
{
this.xsr = xsr;
this.tagDepth = 1;
}
private void readMore()
throws XMLStreamException
{
while (tagDepth > 0 && buf_start == buf_end) {
int nodeType = xsr.next();
if (nodeType == XMLStreamConstants.START_ELEMENT) {
tagDepth++;
}
else if (nodeType == XMLStreamConstants.END_ELEMENT) {
tagDepth--;
}
else if (nodeType == XMLStreamConstants.CDATA ||
nodeType == XMLStreamConstants.CHARACTERS ||
nodeType == XMLStreamConstants.ENTITY_REFERENCE ||
nodeType == XMLStreamConstants.SPACE)
{
buf = xsr.getTextCharacters();
buf_start = xsr.getTextStart();
buf_end = buf_start + xsr.getTextLength();
}
}
}
@Override
public int read(char[] cbuf, int off, int len)
throws IOException
{
if (buf_start == buf_end) {
try {
readMore();
}
catch (XMLStreamException e) {
throw new IOException("XML stream error: "+ e, e);
}
if (tagDepth == 0) {
// reached closing tag
return -1;
}
}
if (buf_start + len <= buf_end) {
// already have the text loaded
System.arraycopy(buf, buf_start, cbuf, off, len);
buf_start += len;
return len;
}
else {
// not enough text available for entire request,
// so just return what we have until the next
// request
len = buf_end - buf_start;
assert len > 0;
System.arraycopy(buf, buf_start, cbuf, off, len);
buf_start += len;
assert buf_start == buf_end;
return len;
}
}
@Override
public void close()
throws IOException
{
buf_start = 0;
buf_end = 0;
try {
while (tagDepth > 0 && xsr.hasNext()) {
xsr.next();
if (xsr.isStartElement()) {
tagDepth++;
}
else if (xsr.isEndElement()) {
tagDepth--;
}
}
}
catch (XMLStreamException e) {
throw new IOException("XML stream error: "+e, e);
}
}
}
}