使XML程式設計更簡單---JDOM介紹及程式設計指南 (轉)
J 介紹及使用指南
一、JDOM 簡介
JDOM是一個專案,它基於樹型結構,利用純的技術對文件實現解析、生成、序列化以及多種操作。
JDOM 直接為JAVA服務。它利用更為強有力的JAVA語言的諸多特性(方法過載、集合概念以及對映),把SAX和DOM的功能有效地結合起來。
在使用設計上儘可能地隱藏原來使用XML過程中的複雜性。利用JDOM處理XML文件將是一件輕鬆、簡單的事。
JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter開發出來,以彌補DOM及SAX在實際應用當中的不足之處。
這些不足之處主要在於SAX沒有文件修改、隨機訪問以及輸出的功能,而對於DOM來說,JAVA員在使用時來用起來總覺得不太方便。
DOM的缺點主要是來自於由於Dom是一個介面定義語言(IDL),它的任務是在不同語言實現中的一個最低的通用標準,並不是為JAVA特別設計的。JDOM的最新版本為JDOM Beta 9。最近JDOM被收錄到JSR-102內,這標誌著JDOM成為了JAVA平臺組成的一部分。
二、JDOM 包概覽
JDOM是由以下幾個包組成的
org.JDOM
org.JDOM.input
org.JDOM.output
org.JDOM.adapters
org.JDOM.tranorm
三、JDOM 類說明
org.JDOM
這個包裡的類是你解析xml後所要用到的所有資料型別。
Attribute
CDATA
Coment
DocType
Document
Element
EntityRef
Namespace
ProscessingInstruction
Text
org.JDOM.transform
在涉及t格式轉換時應使用下面的2個類
JDOM
JDOMResult
org.JDOM.input
輸入類,一般用於文件的建立工作
SAXBuilder
DOMBuilder
ResultSetBuilder
org.JDOM.output
輸出類,用於文件轉換輸出
XMLOutputter
SAXOutputter
DomOutputter
JTreeOutputter
使用前注意事項:
1.JDOM對於JA以及 TRax 的支援
JDOM 支援JAXP1.1:你可以在程式中使用任何的parser工具類,預設情況下是JAXP的parser。
制定特別的parser可用如下形式
SAXBuilder parser
= new SAXBuilder("org..crimson.parser.XMLReaderImpl");
Document doc = parser.build("");
// work with the document...
JDOM也支援TRaX:XSLT可透過JDOMSource以及JDOMResult類來轉換(參見以後章節)
2.注意在JDOM裡文件(Document)類由org.JDOM.Document 來表示。這要與org..dom中的Document區別開,這2種格式如何轉換在後面會說明。
以下如無特指均指JDOM裡的Document。
四、JDOM主要使用方法
1.Ducument類
(1)Document的操作方法:
Element = new Element("GREETING");
Document doc = new Document(root);
root.setText("Hello JDOM!");
或者簡單的使用Document doc = new Document(new Element("GREETING").setText("Hello JDOM!t"));
這點和DOM不同。Dom則需要更為複雜的程式碼,如下:
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
DocumentBuilder builder =factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element root =doc.createElement("root");
Text text = doc.createText("This is the root");
root.appendChild(text);
doc.appendChild(root);
注意事項:JDOM不允許同一個節點同時被2個或多個文件相關聯,要在第2個文件中使用原來老文件中的節點的話。首先需要使用detach()把這個節點分開來。
(2)從檔案、流、ID、URL得到Document:
DOMBuilder builder = new DOMBuilder();
Document doc = builder.build(new File("jdom_test.xml"));
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(url);
在新版本中DOMBuilder 已經Deprecated掉 DOMBuilder.builder(url),用SAX會比較快。
這裡舉一個小例子,為了簡單起見,使用String物件直接作為xml資料來源:
public jdomTest() {
String textXml = null;
textXml = "
textXml = textXml +
"
textXml = textXml + "
SAXBuilder builder = new SAXBuilder();
Document doc = null;
Reader in= new StringReader(textXml);
try {
doc = builder.build(in);
Element root = doc.getRootElement();
List ls = root.getChildren();//注意此處取出的是root節點下面的一層的Element集合
for (Iterator iter = ls.iterator(); iter.hasNext(); ) {
Element el = (Element) iter.next();
if(el.getName().equals("to")){
System.out.println(el.getText());
}
}
}
catch (IOException ex) {
ex.printStackTrace();
}
catch (JDOMException ex) {
ex.printStackTrace();
}
}
很簡單把。
(3)DOM的document和JDOM的Document之間的相互轉換使用方法,簡單!
DOMBuilder builder = new DOMBuilder();
org.jdom.Document jdomDocument = builder.build(domDocument);
// work with the JDOM document…
DOMOutputter converter = new DOMOutputter();
org.w3c.dom.Document domDocument = converter.output(jdomDocument);
// work with the DOM document…
2.XML文件輸出
XMLOutPutter類:
JDOM的輸出非常靈活,支援很多種io格式以及風格的輸出
Document doc = new Document(...);
XMLOutputter outp = new XMLOutputter();
// Raw output
outp.output(doc, fileOutputStream);
// Compressed output
outp.setTextTrim(true);
outp.output(doc, socket.getOutputStream());
// Pretty output
outp.setIndent(" ");
outp.setNewlines(true);
outp.output(doc, System.out);
......
詳細請參閱最新的JDOM 手冊
3.Element 類:
(1)瀏覽Element樹
//獲得根元素element
Element root = doc.getRootElement();
// 獲得所有子元素的一個list
List allChildren = root.getChildren();
// 獲得指定名稱子元素的list
List namedChildren = root.getChildren("name");
//獲得指定名稱的第一個子元素
Element child = root.getChild("name");
(這裡的List是java.util.List)
JDOM給了我們很多很靈活的使用方法來管理子元素
List allChildren = root.getChildren();
// 刪除第四個子元素
allChildren.remove(3);
// 刪除叫“jack”的子元素
allChildren.removeAll(root.getChildren("jack"));
root.removeChildren("jack"); // 便捷寫法
// 加入
allChildren.add(new Element("jane"));
root.addContent(new Element("jane")); // 便捷寫法
allChildren.add(0, new Element("first"));
(2)移動Elements:
在JDOM裡很簡單
Element movable = new Element("movable");
parent1.addContent(movable); // place
parent1.removeContent(movable); // remove
parent2.addContent(movable); // add
在Dom裡
Element movable = doc1.createElement("movable");
parent1.appendChild(movable); // place
parent1.removeChild(movable); // remove
parent2.appendChild(movable); // 出錯!
補充:
糾錯性
JDOM的Element構造(以及它的其他函式)會檢查element是否合法。
而它的add/remove方法會檢查樹結構,檢查內容如下:
1.在任何樹中是否有迴環節點
2.是否只有一個根節點
3.是否有一致的名稱空間(Namespaces)
(3)Element的text內容讀取
A cool demo
// The text is directly available
// Returns "n A cool demon"
String desc = element.getText();
// There's a convenient shortcut
// Returns "A cool demo"
String desc = element.getTextTrim();
(4)Elment內容修改
element.setText("A new description");
3.可正確解釋特殊字元
element.setText("
4.CDA他的資料寫入、讀出
element.addContent(new CDATA("
String noDifference = element.getText();
混合內容
element可能包含很多種內容,比如說
取table的子元素tr
String text = table.getTextTrim();
Element tr = table.getChild("tr");
也可使用另外一個比較簡單的方法
List mixedCo = table.getContent();
Iterator itr = mixedCo.iterator();
while (itr.hasNext()) {
o = i.next();
if (o instanceof Comment) {
...
}
// 這裡可以寫成Comment, Element, Text, CDATA,ProcessingInstruction, 或者是EntityRef的型別
}
// 現在移除Comment,注意這裡遊標應為1。這是由於Enter鍵也被解析成Text類的緣故,所以Comment項應為1。
mixedCo.remove(1);
4.Attribute類
//獲得attribute
String width = table.getAttributeValue("width");
int border = table.getAttribute("width").getIntValue();
//設定attribute
table.setAttribute("vspace", "0");
// 刪除一個或全部attribute
table.removeAttribute("vspace");
table.getAttributes().clear();
5.處理指令(Processing Instructions)操作
一個Pls的例子
| |
| |
目標 資料?cocoon-process>?br>
處理目標名稱(Target)
String target = pi.getTarget();
獲得所有資料(data),在目標(target)以後的所有資料都會被返回。
String data = pi.getData();
獲得指定屬性的資料
String type = pi.getValue("type");
獲得所有屬性的名稱
List ls = pi.getNames();
6.名稱空間操作
<:html> xmlns:xhtml="">
Namespace xhtml = Namespace.getNamespace("xhtml", "");
List kids = html.getChildren("title", xhtml);
Element kid = html.getChild("title", xhtml);
kid.addContent(new Element("table", xhtml));
7.XSLT格式轉換
使用以下函式可對XSLT轉換
最後如果你需要使用w3c的Document則需要轉換一下。
public static Document transform(String stylesheet,Document in)
throws JDOMException {
try {
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(new StreamSource(stylesheet));
JDOMResult out = new JDOMResult();
transformer.transform(new JDOMSource(in), out);
return out.getDeocument();
}
catch (TransformerException e) {
throw new JDOMException("XSLT Trandformation failed", e);
}
}
參考書目:
1.JDOM官方網站:
2.<
3.JDOM API Documentation
4.<
5.WSDP Tutorial
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-984516/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- js DSL超程式設計簡單介紹JS程式設計
- JavaScript 模組化程式設計簡單介紹JavaScript程式設計
- Linux 程式設計工具簡單介紹Linux程式設計
- WebGL程式設計指南(1)簡介Web程式設計
- 風變程式設計,讓程式設計學習更簡單!程式設計
- javascript物件導向程式設計概念簡單介紹JavaScript物件程式設計
- javascript函數語言程式設計簡單介紹JavaScript函數程式設計
- javascript如何實現模組程式設計簡單介紹JavaScript程式設計
- BASH SHELL 程式設計簡介(轉)程式設計
- mod_perl 程式設計介紹 (轉)程式設計
- NIO程式設計介紹程式設計
- 如何向新手程式設計師介紹程式設計?程式設計師
- IO程式設計和NIO程式設計簡介程式設計
- 簡單介紹python程式設計之檔案讀寫Python程式設計
- .NET泛型程式設計簡介 (轉)泛型程式設計
- XML 程式設計思想:XML語義(轉)XML程式設計
- XML 程式設計思想: Harold 的高效 XML 設計原則(轉)XML程式設計
- bash 程式設計指南(轉)程式設計
- Linux下面程式設計工具介紹(轉)Linux程式設計
- windows程式設計簡介Windows程式設計
- shell程式設計簡介程式設計
- Objective-C 執行時程式設計指南-介紹Object程式設計
- Shell程式設計 --- Shell介紹程式設計
- Delphi COM程式設計介紹程式設計
- 好程式設計師web前端培訓分享FormData 簡單介紹程式設計師Web前端ORM
- 002 Rust 非同步程式設計,async await 簡單介紹Rust非同步程式設計AI
- javascript物件導向程式設計關於封裝簡單介紹JavaScript物件程式設計封裝
- 邏輯程式設計與函式程式設計的介紹程式設計函式
- Linux Shell程式設計(1)——shell程式設計簡介Linux程式設計
- XML 程式設計思想:XML和語義(轉)XML程式設計
- XML 程式設計思想: 研讀XML Hacks(轉)XML程式設計
- XML 程式設計思想: XML 語義錨(轉)XML程式設計
- 面向方面程式設計的Annotation簡介(轉)程式設計
- XML程式設計例項(二) (轉)XML程式設計
- XML與ASP程式設計(一) (轉)XML程式設計
- Quartz 2D程式設計指南 (一) —— 簡介(一)quartz程式設計
- DirectShow應用程式設計介紹(翻譯) (轉)程式設計
- javascript設計模式單例模式簡單介紹JavaScript設計模式單例