|
reset();
return result; }
private void peek(int[] buffer) throws IOException { reader.mark(buffer.length); for (int i=0; i<buffer.length; i++) { buffer[i] = reader.read(); } reader.reset(); }
private void skipWhitespace() throws IOException { while (Character.isWhitespace((char)peek())) { reader.read(); } }
private void skipProlog() throws IOException { //跳过<? or <! reader.skip(2);
while (true) { int next = peek();
if (next == >) { reader.read(); break; } else if (next == <) {
skipProlog(); } else { reader.read(); } } }
private void skipPrologs() throws IOException { while (true) { skipWhitespace();
int[] next = new int[2]; peek(next);
if (next[0] != <) { throw new IOException(Expected < but got + (char)next[0] + .); }
if ((next[1] == ?) || (next[1] == !)) { skipProlog(); } else { break; } } }
private String readTag() throws IOException { skipWhitespace();
StringBuffer sb = new StringBuffer();
int next = peek(); if (next != <) { throw new IOException(Expected < but got + (char)next); }
sb.append((char)reader.read()); while (peek() != >) { sb.append((char)reader.read()); } sb.append((char)reader.read());
return sb.toString(); }
private String readText() throws IOException { StringBuffer sb = new StringBuffer();
int[] next = new int[cdata_start.length]; peek(next); if (compareIntArrays(next, cdata_start) == true) { // CDATA reader.skip(next.length);
int[] buffer = new int[cdata_end.length]; while (true) { peek(buffer);
if (compareIntArrays(buffer, cdata_end) == true) { reader.skip(buffer.length); break; } else { sb.append((char)reader.read()); } } } else { while (peek() != <) { sb.append((char)reader.read()); } }
return sb.toString(); }
private boolean compareIntArrays(int[] a1, int[] a2) { if (a1.length != a2.length) { return false; }
for (int i=0; i<a1.length; i++) { if (a1[i] != a2[i]) { return false; } }
return true; } } 为了简单起见,SimpleDOMParser不允许在XML文档中使用注解,并且完全忽视XML声明和DOCTYPE。它使用下面的程序来跳过XML声明和DOCTYPE元素。这个程序递归调用它本身,就像处理一个内部DTD一样处理DOCTYPE。
private void skipProlog() throws IOException {
//跳过<?或者 <!
reader.skip(2);
while (true) {
int next = peek();
if (next == >) {
reader.read();
break;
} else if (next == <) {
skipProlog();
} else {
reader.read();
}
}
}
虽然本文中介绍的SimpleDOMParser只有有限的功能,但是对于许多简单的应用程序来说,它仍然是非常有用的。比如说,一个Java applet可以使用它以XML格式传送数据到一个后端服务器应用程序中。因为它是极其轻便的,所以SimpleDOMParser在资源非常有限的环境中更是很有吸引力的。此外,SimpleDOMParser的实现还很简单。虽然目前的实现只能保存元素,而不能保存声明或者DOCTYPE,但是你可以修改它来处理你想要处理的XML文本,而这一切都是非常容易的。
上一页 [1] [2]
构建自己的轻量级XML DOM分析程序 |