日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
構建輕量級XMLDOM分析程序

XML正迅快速的成為數(shù)據(jù)存儲和交換的標準格式流行開來了?,F(xiàn)在可用的完整的Java XML分析器非常龐大而且功能強大--但是實現(xiàn)這些強大的功能的同時也要消耗等量的資源。

公司主營業(yè)務:成都網(wǎng)站建設、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出錦江免費做網(wǎng)站回饋大家。

因此使用一個功能強大的XML分析器可能過于浪費。如果配置環(huán)境是一個Java小程序或者是一個J2ME應用程序,網(wǎng)絡帶寬或者系統(tǒng)存儲器的制約可能根本不能夠使用完整的XML分析器。本文將告訴你如何構建一個輕量級的XML DOM分析程序。

開始編寫SimpleDOMParser

SimpleDOMParser是一個使用Java寫的高度簡化和超輕量級的XML DOM分析器。 你可以將配置整個分析器配置為一個小于4KB的.jar文件。源程序還不到400行呢。

顯然,使用這么小的代碼,SimpleDOMParser將不支持XML域名空間,不能夠理解多字符集編碼或者以DTD文件或者schema驗證文件;但是SimpleDOMParser能做的就是把符合語法規(guī)則的XML標記解析為一個類似于DOM的元素樹,讓你執(zhí)行從XML格式化文本提取的數(shù)據(jù)的公共任務。

為什么使用DOM作為模型而不是SAX呢?這是因為DOM提供一個比SAX更加易用的程序接口。與SAX不同的是,當你把一個XML文件作為一個DOM樹來處理的時候,這個文件內(nèi)的所有的信息都是可以利用的。雖然SAX分析模型能夠提供比DOM模型更加優(yōu)異的性能和利用更少的存儲空間,但是大部分開發(fā)者在使用SAX的時候都會發(fā)現(xiàn)他們自己正在創(chuàng)建一個完整的或者部分的DOM樹。

使用SAX,一個應用程序每次只能處理一條標記。如果其它的標記內(nèi)容在處理的過程中必須被用到,那你就必須在處理的整個過程保持一種全局狀態(tài)。而保持全局狀態(tài)正是DOM模型目的的精髓。但是許多小型的XML應用程序不需要完整的DOM模型。因此,SimpleDOMParser提供到標記名、層次和內(nèi)容的訪問,但是不涉及完整的W3C DOM的許多用不上的功能。

簡化DOM模型

一個DOM樹是由分析XML文件產(chǎn)生的結點組成。結點是一個XML實體的非存儲表現(xiàn)。標準W3C DOM模型有幾種類型的結點。 舉例來說,一個文本結點表示在XML文件中的一段文本,一個元素結點表示XML文件而一個屬性結點表示一個元素內(nèi)部的屬性名和值。

DOM是一個樹,因為除了根或文件結點以外的每個結點都有一個父結點。舉例來說,屬性結點總是和一個元素結點相關聯(lián),而用來封裝元素的起始標記和結束標記中的文本是映射到一個文本結點的。文本結點是元素結點的一個子節(jié)點。所以,即使很簡單的XML文件的表現(xiàn)也可能會需要很多種節(jié)點類型。舉例來說,圖1表示下面XML文件的一個W3C DOM樹形表示。

 
 
 
  1. <parser>SimpleDOMParser</parser>

正如你在圖1中所看見的,DOM模型使用一個document類型節(jié)點來封裝整個XML文件,所以DOM使用三種不同的節(jié)點。通過把所有的DOM節(jié)點類型抽象成為一個單獨的類型SimpleElement來盡可能的簡化DOM模型。一個SimpleElement獲得一個XML元素的關鍵的信息,比如標識名、元素屬性和任何封裝的文本或者XML。此外,SimpleDOMParser不使用任何特殊的節(jié)點類型表示***等級的文檔。結果是大大地簡化了DOM樹,使之只包含SimpleElement節(jié)點。圖2表示了簡化的DOM樹。

代碼段1給出了SimpleElement類的完整的源程序。

 
 
 
  1. public class SimpleElement {
  2. private String tagName;
  3. private String text;
  4. private HashMap attributes;
  5. private LinkedList childElements;
  6. public SimpleElement(String tagName) {
  7. this.tagName = tagName;
  8. attributes = new HashMap();
  9. childElements = new LinkedList();
  10. }
  11. public String getTagName() {
  12. return tagName;
  13. }
  14. public void setTagName(String tagName) {
  15. this.tagName = tagName;
  16. }
  17. public String getText() {
  18. return text;
  19. }
  20. public void setText(String text) {
  21. this.text = text;
  22. }
  23. public String getAttribute(String name) {
  24. return (String)attributes.get(name);
  25. }
  26. public void setAttribute(String name, String value) {
  27. attributes.put(name, value);
  28. }
  29. public void addChildElement(SimpleElement element) {
  30. childElements.add(element);
  31. }
  32. public Object[] getChildElements() {
  33. return childElements.toArray();
  34. }
  35. }  

#p#

定義XML語法分析基本元素

為了把一個XML文件處理成為上面提到的簡化的DOM樹模型,我們必須定義一些基本的語法分析規(guī)則。使用這些規(guī)則,語法分析程序就能容易地從輸入的XML文件中提取標記或者文本塊。

***個是peek,從輸入的XML文件中返回下一個字符,而實際上則不必從下層流中獲得這個字符。通過保持輸入流的完整性,高級函數(shù)比如readTag和readText(后面將介紹)可以更加容易地根據(jù)它們接下來期待的字符獲取需要的內(nèi)容。

 
 
 
  1. private int peek() throws IOException { 
  2. reader.mark(1); 
  3. int result = reader.read(); 
  4. reader.reset(); 
  5. return result; 
  6. }  

下一個方法是skipWhitespce,作用是跳過輸入的XML流中的空格、制表符或者回車符。

 
 
 
  1. private void skipWhitespace() throws IOException { 
  2. while (Character.isWhitespace((char) peek())) { 
  3. reader.read(); 

在創(chuàng)建了如上所述的這兩個方法后,我們就可以寫一個函數(shù)從輸入文件中檢索XML標記。

 
 
 
  1. private String readTag() throws IOException { 
  2. skipWhitespace(); 
  3. StringBuffer sb = new StringBuffer(); 
  4. int next = peek(); 
  5. if (next != '<') { 
  6. throw new IOException 
  7. ("Expected > but got " + (char) next); 
  8. sb.append((char)reader.read()); 
  9. while (peek() != '>') { 
  10. sb.append((char)reader.read()); 
  11. sb.append((char)reader.read()); 
  12. return sb.toString(); 

和peek方法聯(lián)合使用,readTag函數(shù)只獲得一個標記的內(nèi)容,而讓別的函數(shù)去處理其他的內(nèi)容。 ***的一個方法是readText函數(shù),用來讀取XML標記之間的文本。

 
 
 
  1. private String readText() throws IOException { 
  2. int[] cdata_start = {'<', '!', 
  3. '[', 'C', 'D', 'A', 'T', 'A', '['}; 
  4. int[] cdata_end = {']', ']', '>'}; 
  5. StringBuffer sb = new StringBuffer(); 
  6. int[] next = new int[cdata_start.length]; 
  7. peek(next); 
  8. if (compareIntArrays(next, cdata_start) == true) { 
  9. // CDATA 
  10. reader.skip(next.length); 
  11. int[] buffer = new int[cdata_end.length]; 
  12. while (true) { 
  13. peek(buffer); 
  14. if (compareIntArrays 
  15. (buffer, cdata_end) == true) { 
  16. reader.skip(buffer.length); 
  17. break; 
  18. } else { 
  19. sb.append((char)reader.read()); 
  20. } else { 
  21. while (peek() != '<') { 
  22. sb.append((char)reader.read()); 
  23. return sb.toString(); 
  24. }  

這次使用的peek方法是前面那個從基本的XML文檔返回一個字符串序列的peek方法的變體。這個peek變體讓語法分析程序判斷它將分析的文本是否被裝入一個CDATA塊。compareIntArrays函數(shù)是一個執(zhí)行兩個整數(shù)數(shù)組的深度比較的簡單程序。

#p#

定義XML語法分析基本元素

為了把一個XML文件處理成為上面提到的簡化的DOM樹模型,我們必須定義一些基本的語法分析規(guī)則。使用這些規(guī)則,語法分析程序就能容易地從輸入的XML文件中提取標記或者文本塊。

***個是peek,從輸入的XML文件中返回下一個字符,而實際上則不必從下層流中獲得這個字符。通過保持輸入流的完整性,高級函數(shù)比如readTag和readText(后面將介紹)可以更加容易地根據(jù)它們接下來期待的字符獲取需要的內(nèi)容。

 
 
 
  1. private int peek() throws IOException { 
  2. reader.mark(1); 
  3. int result = reader.read(); 
  4. reader.reset(); 
  5. return result; 
  6. }  

下一個方法是skipWhitespce,作用是跳過輸入的XML流中的空格、制表符或者回車符。

 
 
 
  1. private void skipWhitespace() throws IOException { 
  2. while (Character.isWhitespace((char) peek())) { 
  3. reader.read(); 

在創(chuàng)建了如上所述的這兩個方法后,我們就可以寫一個函數(shù)從輸入文件中檢索XML標記。

 
 
 
  1. private String readTag() throws IOException { 
  2. skipWhitespace(); 
  3. StringBuffer sb = new StringBuffer(); 
  4. int next = peek(); 
  5. if (next != '<') { 
  6. throw new IOException 
  7. ("Expected > but got " + (char) next); 
  8. sb.append((char)reader.read()); 
  9. while (peek() != '>') { 
  10. sb.append((char)reader.read()); 
  11. sb.append((char)reader.read()); 
  12. return sb.toString(); 

和peek方法聯(lián)合使用,readTag函數(shù)只獲得一個標記的內(nèi)容,而讓別的函數(shù)去處理其他的內(nèi)容。 ***的一個方法是readText函數(shù),用來讀取XML標記之間的文本。

 
 
 
  1. private String readText() throws IOException { 
  2. int[] cdata_start = {'<', '!', 
  3. '[', 'C', 'D', 'A', 'T', 'A', '['}; 
  4. int[] cdata_end = {']', ']', '>'}; 
  5. StringBuffer sb = new StringBuffer(); 
  6. int[] next = new int[cdata_start.length]; 
  7. peek(next); 
  8. if (compareIntArrays(next, cdata_start) == true) { 
  9. // CDATA 
  10. reader.skip(next.length); 
  11. int[] buffer = new int[cdata_end.length]; 
  12. while (true) { 
  13. peek(buffer); 
  14. if (compareIntArrays 
  15. (buffer, cdata_end) == true) { 
  16. reader.skip(buffer.length); 
  17. break; 
  18. } else { 
  19. sb.append((char)reader.read()); 
  20. } else { 
  21. while (peek() != '<') { 
  22. sb.append((char)reader.read()); 
  23. return sb.toString(); 
  24. }  

這次使用的peek方法是前面那個從基本的XML文檔返回一個字符串序列的peek方法的變體。這個peek變體讓語法分析程序判斷它將分析的文本是否被裝入一個CDATA塊。 compareIntArrays函數(shù)是一個執(zhí)行兩個整數(shù)數(shù)組的深度比較的簡單程序。


分享題目:構建輕量級XMLDOM分析程序
網(wǎng)頁鏈接:http://www.5511xx.com/article/cdioicp.html