XML的JAVA 解析(一)(4) (轉)

gugu99發表於2008-04-26
XML的JAVA 解析(一)(4) (轉)[@more@]

共用標籤的
在我們開始探討更復雜的容器結構之前,我們還要搞掂SAX的另一個麻煩。雖然它不常見,在文件中出現在不同位置的資料也許會共用同一標籤名卻屬於不同的物件。假設你有一個customer節點, XML文件中有一個cunstomer representative(客戶代表)節點。這些節點都有FirstName和LastName標籤。有了這個含糊的地方,在endElement事件中你就無法確定快取裡的內容到底該賦給哪個物件。你還要跟蹤某些startElement SAX事件中的資訊好弄清該由哪個物件來收集endElement SAX事件中的資料。microsoft-com::office" />

如果XML文件本來就沒有DTD或DTD已經改變而對映程式碼卻沒有變,就算對一個起初並不包含這種結構的XML文件來說,這個問題也會很危險。沒有了DTD,你的客戶(譯註:指你所編程式碼的使用者)合法地給你提供任何你將對映到的位置錯誤的標籤。

事實上,對這一問題唯一的辦法是不斷跟蹤所有開啟的起始標籤。作為一個簡單的例子,讓我們來看看下面這個XML文件:




 
 
 Some Customer Name
 

 
 
  The customer's company name
 

 

 
 

雖然標籤名Name並不唯一,但是到達標籤名的路徑是唯一的——要麼是CustomerInformation->Customer->Name 或者是 CustomerInformation->Customer->Company->Name。總是儲存完全路徑可以保證偶爾重用的標籤名不會讓你的程式碼不知所措。這也說明對映遞迴巢狀的XML結構時存在一個需要解決的問題;我們將在下篇文章中討論這個問題。

接下來,我們看到兩個處理這一情形的例子。第一個例子是一個暴力的if 方案。 我要在所含元素的startElement SAX事件發生時設定某些標誌。然後在endElement事件中, 我將執行以標誌為條件的if語句以判斷資料應該賦給哪個物件。

以下你將看到我們的說明重複標籤解析方法的XML樣本文件:






 
  3
  0
  3
  5
 


 
  5
  0
  3
  5
 


 
  0
  0
  3
  3
 


 
  10
  10
  3
  3
 



接下來是我們的所有幾何圖形類的基類:


package common;


// 基類擁有幾何圖形的共有屬性。


public class Shape {

  public int x = 0;
  public int y = 0;

  public int height = 0;
  public int width = 0;
 


}

簡單的三角形類:


package common;


import java.io.*;

//三角形


public class Triangle extends Shape {



  // 三角形特有屬性...


  public String name = ""; 
 
  public void print( PrintStream out ){

 out.println( "Triange: " + name +
 " x: " + x +
 " y: " + y +
 " width: " + width +
 " height: " + height ); 

  }

}

接下來是簡單的長方形類:


package common;


import java.io.*;



// 長方形


public class Square extends Shape {

  // 長方形待有屬性...

  public String name = ""; 
 
  public void print( PrintStream out ){

 out.println( "Square: " + name +
 " x: " + x +
 " y: " + y +
 " width: " + width +
 " height: " + height ); 

  }



}

圓形類:


package common;


import java.io.*;

// 圓


public class Circle extends Shape {

  // 圓的特有屬性

  public String name = "";

  public void print( PrintStream out ){

 out.println( "Circle: " + name +
 " x: " + x +
 " y: " + y +
 " width: " + width +
 " height: " + height );

  }



}

 

(未完待續)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1003025/,如需轉載,請註明出處,否則將追究法律責任。

相關文章