亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

創造一種迅速而又隨性的XML解釋器

2019-11-18 12:47:45
字體:
來源:轉載
供稿:網友


  xml是一種當前很受歡迎的數據格式, 它的優點在于: 人性化,自述性以及使用的方便性.但是,不幸的是,基于java的xml解釋器往往太大了,比如sun的jaXP.jar 和 parser.jar 每個都達到了1.4mb. 假如你要在只有有限的內存容量的運行環境里運行你的程序,比如j2me的環境.或者說帶寬很有限的運行環境里,比如applet,這些大的package不應該成為你的選擇對象.
  注重:本篇的所有所需要的所有代碼你可以通過此鏈接下載:
  http://www.matrix.org.cn/down_view.asp?id=67
  下面是QDParser的代碼:
  package qdxml;
  import java.io.*;
  import java.util.*;
  
  /** Quick and Dirty xml parser. This parser is, like the SAX parser,
  an event based parser, but with mUCh less functionality. */
  public class QDParser {
  PRivate static int popMode(Stack st) {
  if(!st.empty())
  return ((Integer)st.pop()).intvalue();
  else
  return PRE;
  }
  private final static int
  TEXT = 1,
  ENTITY = 2,
  OPEN_TAG = 3,
  CLOSE_TAG = 4,
  START_TAG = 5,
  ATTRIBUTE_Lvalue = 6,
  ATTRIBUTE_EQUAL = 9,
  ATTRIBUTE_Rvalue = 10,
  QUOTE = 7,
  IN_TAG = 8,
  SINGLE_TAG = 12,
  COMMENT = 13,
  DONE = 11,
  DOCTYPE = 14,
  PRE = 15,
  CDATA = 16;
  public static void parse(DocHandler doc,Reader r) throws Exception {
  Stack st = new Stack();
  int depth = 0;
  int mode = PRE;
  int c = 0;
  int quotec = '"';
  depth = 0;
  StringBuffer sb = new StringBuffer();
  StringBuffer etag = new StringBuffer();
  String tagName = null;
  String lvalue = null;
  String rvalue = null;
  Hashtable attrs = null;
  st = new Stack();
  doc.startdocument.);
  int line=1, col=0;
  boolean eol = false;
  while((c = r.read()) != -1) {
  
  // We need to map /r, /r/n, and /n to /n
  // See XML spec section 2.11
  if(c == '/n' && eol) {
  eol = false;
  continue;
  } else if(eol) {
  eol = false;
  } else if(c == '/n') {
  line++;
  col=0;
  } else if(c == '/r') {
  eol = true;
  c = '/n';
  line++;
  col=0;
  } else {
  col++;
  }
  
  if(mode == DONE) {
  doc.enddocument.);
  return;
  
  // We are between tags collecting text.
  } else if(mode == TEXT) {
  if(c == '<') {
  st.push(new Integer(mode));
  mode = START_TAG;
  if(sb.length() > 0) {
  doc.text(sb.toString());
  sb.setLength(0);
  }
  } else if(c == '&') {
  st.push(new Integer(mode));
  mode = ENTITY;
  etag.setLength(0);
  } else
  sb.append((char)c);
  
  // we are processing a closing tag: e.g. </foo>
  } else if(mode == CLOSE_TAG) {
  if(c == '>') {
  mode = popMode(st);
  tagName = sb.toString();
  sb.setLength(0);
  depth--;
  if(depth==0)
  mode = DONE;
  doc.endElement(tagName);
  } else {
  sb.append((char)c);
  }
  
  // we are processing CDATA
  } else if(mode == CDATA) {
  if(c == '>'
  && sb.toString().endsWith("]]")) {
  sb.setLength(sb.length()-2);
  doc.text(sb.toString());
  sb.setLength(0);
  mode = popMode(st);
  } else
  sb.append((char)c);
  
  // we are processing a comment. We are inside
  // the <!-- .... --> looking for the -->.
  } else if(mode == COMMENT) {
  if(c == '>'
  && sb.toString().endsWith("--")) {
  sb.setLength(0);
  mode = popMode(st);
  } else
  sb.append((char)c);
  
  // We are outside the root tag element
  } else if(mode == PRE) {
  if(c == '<') {
  mode = TEXT;
  st.push(new Integer(mode));
  mode = START_TAG;
  }
  
  // We are inside one of these <? ... ?>
  // or one of these <!DOCTYPE ... >
  } else if(mode == DOCTYPE) {
  if(c == '>') {
  mode = popMode(st);
  if(mode == TEXT) mode = PRE;
  }
  
  // we have just seen a < and
  // are wondering what we are looking at
  // <foo>, </foo>, <!-- ... --->, etc.
  } else if(mode == START_TAG) {
  mode = popMode(st);
  if(c == '/') {
  st.push(new Integer(mode));
  mode = CLOSE_TAG;
  } else if (c == '?') {
  mode = DOCTYPE;
  } else {
  st.push(new Integer(mode));
  mode = OPEN_TAG;
  tagName = null;
  attrs = new Hashtable();
  sb.append((char)c);
  }
  
  // we are processing an entity, e.g. <, », etc.
  } else if(mode == ENTITY) {
  if(c == ';') {
  mode = popMode(st);
  String cent = etag.toString();
  etag.setLength(0);
  if(cent.equals("lt"))
  sb.append('<');
  else if(cent.equals("gt"))
  sb.append('>');
  else if(cent.equals("amp"))
  sb.append('&');
  else if(cent.equals("quot"))
  sb.append('"');
  else if(cent.equals("apos"))
  sb.append('/'');
  // Could parse hex entities if we wanted to
  //else if(cent.startsWith("#x"))
  //sb.append((char)Integer.parseInt(cent.substring(2),16));
  else if(cent.startsWith("#"))
  sb.append((char)Integer.parseInt(cent.substring(1)));
  // Insert custom entity definitions here
  else
  exc("Unknown entity: &"+cent+";",line,col);
  } else {
  etag.append((char)c);
  }
  
  // we have just seen something like this:
  // <foo a="b"/
  // and are looking for the final >.
  } else if(mode == SINGLE_TAG) {
  if(tagName == null)
  tagName = sb.toString();
  if(c != '>')
  exc("Expected > for tag: <"+tagName+"/>",line,col);
  doc.startElement(tagName,attrs);
  doc.endElement(tagName);
  if(depth==0) {
  doc.enddocument.);
  return;
  }
  sb.setLength(0);
  attrs = new Hashtable();
  tagName = null;
  mode = popMode(st);
  
  // we are processing something
  // like this <foo ... >. It could
  // still be a <!-- ... --> or something.
  } else if(mode == OPEN_TAG) {
  if(c == '>') {
  if(tagName == null)
  tagName = sb.toString();
  sb.setLength(0);
  depth++;
  doc.startElement(tagName,attrs);
  tagName = null;
  attrs = new Hashtable();
  mode = popMode(st);
  } else if(c == '/') {
  mode = SINGLE_TAG;
  } else if(c == '-' && sb.toString().equals("!-")) {
  mode = COMMENT;
  } else if(c == '[' && sb.toString().equals("![CDATA")) {
  mode = CDATA;
  sb.setLength(0);
  } else if(c == 'E' && sb.toString().equals("!DOCTYP")) {
  sb.setLength(0);
  mode = DOCTYPE;
  } else if(Character.isWhitespace((char)c)) {
  tagName = sb.toString();
  sb.setLength(0);
  mode = IN_TAG;
  } else {
  sb.append((char)c);
  }
  
  // We are processing the quoted right-hand side
  // of an element's attribute.
  } else if(mode == QUOTE) {
  if(c == quotec) {
  rvalue = sb.toString();
  sb.setLength(0);
  attrs.put(lvalue,rvalue);
  mode = IN_TAG;
  // See section the XML spec, section 3.3.3
  // on normalization processing.
  } else if(" /r/n/u0009".indexOf(c)>=0) {
  sb.append(' ');
  } else if(c == '&') {
  st.push(new Integer(mode));
  mode = ENTITY;
  etag.setLength(0);
  } else {
  sb.append((char)c);
  }
  
  } else if(mode == ATTRIBUTE_Rvalue) {
  if(c == '"' c == '/'') {
  quotec = c;
  mode = QUOTE;
  } else if(Character.isWhitespace((char)c)) {
  
  } else {
  exc("Error in attribute processing",line,col);
  }
  
  } else if(mode == ATTRIBUTE_Lvalue) {
  if(Character.isWhit

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久亚洲影视| 在线成人一区二区| 国产日韩欧美视频| 日韩午夜在线视频| 亚洲人成毛片在线播放| 亚洲国产精品网站| 成人免费视频网址| 中文字幕精品视频| 亚洲理论片在线观看| 久久久精品国产亚洲| 欧美人交a欧美精品| 国产一区二区免费| 久久综合免费视频| 91久久在线视频| 午夜精品理论片| 欧美激情视频在线免费观看 欧美视频免费一| 中文字幕免费精品一区| 国产91精品高潮白浆喷水| 日韩av有码在线| 欧美日韩国产精品一区二区三区四区| 欧美激情第6页| 中文字幕久久久av一区| 日本国产精品视频| 亚洲国产精品专区久久| 亚洲激情在线视频| 国产精品视频一区二区三区四| 亚洲美女又黄又爽在线观看| 色久欧美在线视频观看| 国产欧美日韩丝袜精品一区| 91久久国产婷婷一区二区| 精品夜色国产国偷在线| 欧美做受高潮1| 永久555www成人免费| 欧美大片在线看免费观看| 日韩hd视频在线观看| 中文在线不卡视频| 亚洲一区二区精品| 欧美色视频日本版| 色妞在线综合亚洲欧美| 亚洲第一二三四五区| 亚洲成年人在线| 亚洲欧美中文日韩v在线观看| 亚洲aaaaaa| 伊人久久精品视频| 成人免费大片黄在线播放| 久久99热精品| 国产精品久久久久77777| 欧美重口另类videos人妖| 欧美福利视频在线| 在线精品国产欧美| 久久久久久美女| 4388成人网| 国产成人av网| 欧美精品亚州精品| 秋霞午夜一区二区| 欧美日韩国产一中文字不卡| 亚洲专区中文字幕| 91深夜福利视频| 欧美猛交免费看| 久久精品成人一区二区三区| 精品久久久久久国产| 色综久久综合桃花网| 欧美成人四级hd版| 欧美视频专区一二在线观看| 成人妇女淫片aaaa视频| 国产精品美女久久久免费| 国产精品白丝av嫩草影院| 2019国产精品自在线拍国产不卡| 97在线观看视频| 日韩中文综合网| 欧美在线视频在线播放完整版免费观看| 国产一区香蕉久久| 久久精品在线播放| 亚洲精品一区中文字幕乱码| 精品亚洲va在线va天堂资源站| 91麻豆国产精品| 亚洲最新av在线网站| 亚洲欧美成人在线| 国产精品电影久久久久电影网| 97超级碰碰人国产在线观看| 国产精品久久久久久影视| 欧美激情视频一区二区三区不卡| 国产精品高潮呻吟久久av无限| www.日本久久久久com.| 琪琪亚洲精品午夜在线| 精品亚洲一区二区三区在线观看| 亚洲国产成人在线播放| 日韩三级成人av网| 最新69国产成人精品视频免费| 揄拍成人国产精品视频| 欧美高清视频一区二区| 久久伊人精品视频| 97av在线视频| 黄色精品在线看| 亚洲欧美另类人妖| 欧美日韩国产123| 欧美网站在线观看| 欧美最近摘花xxxx摘花| 国内精品一区二区三区| 韩国欧美亚洲国产| 色婷婷综合成人| 日韩av成人在线| 国产精品爽爽ⅴa在线观看| 91精品国产成人www| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品视频xxxx| 亚洲欧美国产精品专区久久| 日韩中文字幕在线观看| 18久久久久久| 日韩av电影在线免费播放| 国产91在线播放九色快色| 日韩av理论片| 国产精品视频资源| 一区二区三区四区精品| 欧美老女人性视频| 亚洲午夜精品久久久久久性色| 这里只有精品丝袜| 欧美国产精品人人做人人爱| 亚洲2020天天堂在线观看| 欧美精品成人91久久久久久久| 在线视频日本亚洲性| 亚州av一区二区| 国内精品一区二区三区四区| 久久综合网hezyo| 久久99国产精品久久久久久久久| 亚洲精品wwwww| 欧美一区二区大胆人体摄影专业网站| 日韩69视频在线观看| 亚洲韩国欧洲国产日产av| www日韩欧美| 欧美综合一区第一页| 日韩中文字幕网址| 国产成人亚洲精品| 中文字幕亚洲无线码a| 久久伊人精品一区二区三区| 日韩有码片在线观看| 日本一区二区在线免费播放| 国产精品中文字幕久久久| 国产欧美精品一区二区三区介绍| 国产精品久久久久高潮| 欧美高跟鞋交xxxxhd| 成人激情春色网| 中文字幕日韩免费视频| 自拍偷拍免费精品| 国产亚洲一级高清| 亚洲影院污污.| 欧美一级淫片丝袜脚交| 精品福利在线看| 91国在线精品国内播放| 亚洲一区www| 有码中文亚洲精品| 日本免费在线精品| 精品久久久999| 国产精品日本精品| 国产噜噜噜噜噜久久久久久久久| 亚洲人成人99网站| 亚洲电影免费观看高清完整版在线观看| 欧美激情亚洲综合一区| 欧美激情18p| 精品久久久久久国产91| 一本大道香蕉久在线播放29| 日本在线观看天堂男亚洲| 欧美怡春院一区二区三区| 亚洲男人第一av网站|