注銷

          注銷

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            112 隨筆 :: 7 文章 :: 18 評論 :: 0 Trackbacks

          ?

          目前在java平臺上,要解析xml文檔,即使只有"<abc></abc>"這樣的一個標簽,在生成document對象時,也至少要花費300ms左右,這樣一次交互至少要在600ms左右,加上其它處理,一次通訊要1000ms以上,使得soap協議在java平臺上根本不能進行實際應用.

          其它這并不是SOAP協議的問題,著關鍵在于對XML文檔的解析.基于這個原因,筆者實現了用正則表達式來解析XML文檔的一些API,利用它來在替換中移動的大多數SOAP的接口,效率提高了10倍左右.

          package org.axman.xml.regex;

          import java.util.regex.*;
          import java.util.*;

          /**
          ?*
          ?* <p>Title: Document</p>
          ?*
          ?* <p>Description: 用正則表達式解析xml,目的是為了提高性能.</p>
          ?*
          ?* <p>Copyright: Copyright (c) 2005</p>
          ?*
          ?* <p>Company: org.axman</p>
          ?*
          ?* @author :Axman
          ?* @version 1.0
          ?*/
          public class Document {
          ? private String xmlString;

          ? /**
          ?? * 傳入xml的字符串內容,對于InputStream,Reader對象請轉換為String對象后傳入構造方法.
          ?? * @param xmlString String
          ?? * @throws IllegalArgumentException
          ?? */
          ? public Document(String xmlString) throws IllegalArgumentException{
          ??? if(xmlString == null || xmlString.length() == 0)
          ????? throw new IllegalArgumentException("Input string orrer!");
          ??? this.xmlString = xmlString;
          ? }


          ? /**
          ?? * 在文檔中搜索指定的元素,返回符合條件的元素數組.
          ?? * @param tagName String
          ?? * @return String[]
          ?? */
          ? public String[] getElementsByTag(String tagName){
          ??? Pattern p = Pattern.compile("<"+tagName+"[^>]*?((>.*?</"+tagName+">)|(/>))");
          ??? Matcher m = p.matcher(this.xmlString);
          ??? ArrayList<String> al = new ArrayList<String>();
          ??? while(m.find())
          ????? al.add(m.group());
          ??? String[] arr = al.toArray(new String[al.size()]);
          ??? al.clear();
          ??? return arr;
          ? }


          ? /**
          ?? * 用xpath模式提取元素,以#為分隔符
          ?? * 如 ROOT#PARENT#CHILD表示提取ROOT元素下的PARENT元素下的CHILD元素
          ?? * @param singlePath String
          ?? * @return String
          ?? */
          ? public String getElementBySinglePath(String singlePath){
          ??? String[] path = singlePath.split("#");
          ??? String lastTag = path[path.length-1];
          ??? String tmp = "(<"+lastTag+"[^>]*?((>.*?</"+lastTag+">)|(/>)))";
          ??????????????????????????????????????? //最后一個元素,可能是<x>v</x>形式或<x/>形式
          ??? for(int i=path.length-2;i >=0;i--){
          ????? lastTag = path[i];
          ????? tmp = "<"+lastTag+">.*"+tmp + ".*</"+lastTag+">";
          ??? }
          ??? Pattern p = Pattern.compile(tmp);
          ??? Matcher m = p.matcher(this.xmlString);
          ??? if(m.find()){
          ????? return m.group(1);
          ??? }
          ??? return "";
          ? }

          ? /**
          ?? * 用xpath模式提取元素從多重元素中獲取指批定元素,以#為分隔符
          ?? * 元素后無索引序號則默認為0: ROOT#PARENT[2]#CHILD[1]
          ?? * @param singlePath String
          ?? * @return String
          ?? */
          ? public String getElementByMultiPath(String singlePath){
          ??? try{
          ????? String[] path = singlePath.split("#");
          ????? String input = this.xmlString;
          ????? String[] ele = null;
          ????? for (int i = 0; i < path.length; i++) {
          ??????? Pattern p = Pattern.compile("(\\w+)(\\[(\\d+)\\])?");
          ??????? Matcher m = p.matcher(path[i]);
          ??????? if (m.find()) {
          ????????? String tagName = m.group(1);
          ????????? System.out.println(input + "----" + tagName);
          ????????? int index = (m.group(3) == null) ? 0 :
          ????????????? new Integer(m.group(3)).intValue();
          ????????? ele = getElementsByTag(input, tagName);
          ????????? input = ele[index];
          ??????? }
          ????? }
          ????? return input;
          ??? }catch(Exception e){
          ????? return null;
          ??? }
          ? }

          ? /**
          ?? * 在給定的元素中搜索指定的元素,返回符合條件的元素數組.對于不同級別的同名元素限制作用,即可以
          ?? * 搜索元素A中的子元素C.而對于元素B中子元素C則過慮,通過多級限定可以準確定位.
          ?? * @param parentElementString String
          ?? * @param tagName String
          ?? * @return String[]
          ?? */
          ? public static String[] getElementsByTag(String parentElementString,String tagName){
          ??? Pattern p = Pattern.compile("<"+tagName+"[^>]*?((>.*?</"+tagName+">)|(/>))");
          ??? Matcher m = p.matcher(parentElementString);
          ??? ArrayList<String> al = new ArrayList<String>();
          ??? while(m.find())
          ????? al.add(m.group());
          ??? String[] arr = al.toArray(new String[al.size()]);
          ??? al.clear();
          ??? return arr;
          ? }

          ? /**
          ?? * 從指定的父元素中根據xpath模式獲取子元素,singlePath以#為分隔符
          ?? * 如 ROOT#PARENT#CHILD表示提取ROOT元素下的PARENT元素下的CHILD元素
          ?? * @param parentElementString String
          ?? * @param singlePath String
          ?? * @return String
          ?? */
          ? public static String getElementBySinglePath(String parentElementString,String singlePath){
          ??? String[] path = singlePath.split("#");
          ??? String lastTag = path[path.length-1];
          ??? String tmp = "(<"+lastTag+"[^>]*?((>.*?</"+lastTag+">)|(/>)))";
          ??????????????????????????????????????? //最后一個元素,可能是<x>v</x>形式或<x/>形式
          ??? for(int i=path.length-2;i >=0;i--){
          ????? lastTag = path[i];
          ????? tmp = "<"+lastTag+">.*"+tmp + ".*</"+lastTag+">";
          ??? }
          ??? Pattern p = Pattern.compile(tmp);
          ??? Matcher m = p.matcher(parentElementString);
          ??? if(m.find()){
          ????? return m.group(1);
          ??? }
          ??? return "";
          ? }

          ? /**
          ?? * 用xpath模式提取元素從指定的多重元素中獲取指批定元素,以#為分隔符
          ?? * @param parentElementString String
          ?? * @param singlePath String
          ?? * @return String
          ?? */
          ? public static String getElementByMultiPath(String parentElementString,String singlePath){
          ??? try{
          ????? String[] path = singlePath.split("#");
          ????? String input = parentElementString;
          ????? String[] ele = null;
          ????? for (int i = 0; i < path.length; i++) {
          ??????? Pattern p = Pattern.compile("(\\w+)(\\[(\\d+)\\])?");
          ??????? Matcher m = p.matcher(path[i]);
          ??????? if (m.find()) {
          ????????? String tagName = m.group(1);
          ????????? int index = (m.group(3) == null) ? 0 :
          ????????????? new Integer(m.group(3)).intValue();
          ????????? ele = getElementsByTag(input, tagName);
          ????????? input = ele[index];
          ??????? }
          ????? }
          ????? return input;
          ??? }catch(Exception e){
          ????? return null;
          ??? }
          ? }


          ? /**
          ?? * 在給定的元素中獲取所有屬性的集合.該元素應該從getElementsByTag方法中獲取
          ?? * @param elementString String
          ?? * @return HashMap
          ?? */
          ? public HashMap<String,String> getAttributes(String elementString){
          ??? HashMap hm = new HashMap<String,String>();
          ??? Pattern p = Pattern.compile("<[^>]+>");
          ??? Matcher m = p.matcher(elementString);
          ??? String tmp = m.find()?m.group():"";
          ??? p = Pattern.compile("(\\w+)\\s*=\\s*\"([^\"]+)\"");
          ??? m = p.matcher(tmp);
          ??? while(m.find()){
          ????? hm.put(m.group(1).trim(),m.group(2).trim());
          ??? }
          ??? return hm;
          ? }


          ? /**
          ?? * 在給定的元素中獲取指定屬性的值.該元素應該從getElementsByTag方法中獲取
          ?? * @param elementString String
          ?? * @param attributeName String
          ?? * @return String
          ?? */
          ? public static String getAttribute(String elementString,String attributeName){
          ??? HashMap hm = new HashMap<String,String>();
          ??? Pattern p = Pattern.compile("<[^>]+>");
          ??? Matcher m = p.matcher(elementString);
          ??? String tmp = m.find()?m.group():"";
          ??? p = Pattern.compile("(\\w+)\\s*=\\s*\"([^\"]+)\"");
          ??? m = p.matcher(tmp);
          ??? while(m.find()){
          ????? if(m.group(1).trim().equals(attributeName))
          ??????? return m.group(2).trim();
          ??? }
          ??? return "";
          ? }


          ? /**
          ?? * 獲取指定元素的文本內容
          ?? * @param elementString String
          ?? * @return String
          ?? */
          ? public static String getElementText(String elementString){
          ??? Pattern p = Pattern.compile(">([^<>]*)<");
          ??? Matcher m = p.matcher(elementString);
          ??? if(m.find()){
          ????? return m.group(1);
          ??? }
          ??? return "";
          ? }

          ? public static void main(String[] args){
          ??? new Document("<ROOT>sss <PARENT>sss <CHILD>aaaa</CHILD>ss </PARENT>sss </ROOT>").getElementByMultiPath("ROOT[0]#PARENT#CHILD");
          ??? //System.out.println(child);
          ? }

          }

          posted on 2006-11-15 17:41 注銷..... 閱讀(1282) 評論(0)  編輯  收藏 所屬分類: .net摘要
          主站蜘蛛池模板: 抚松县| 阿拉尔市| 都兰县| 五常市| 和硕县| 兴和县| 卫辉市| 白银市| 延津县| 罗平县| 凤庆县| 化州市| 东台市| 新泰市| 铁岭县| 大名县| 革吉县| 石首市| 平山县| 翁源县| 金平| 治多县| 九台市| 大英县| 平阳县| 郧西县| 仁化县| 甘谷县| 汽车| 辽阳县| 大渡口区| 新营市| 阿拉善右旗| 涿州市| 教育| 都匀市| 红安县| 海盐县| 荃湾区| 桑日县| 龙口市|