四、JDOM主要使用方法
1.Ducument類
(1)Document的操作方法:
Element root = 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 = "<note>";
textXml = textXml +
"<to>aaa</to><from>bbb</from><heading>ccc</heading><body>ddd</body>";
textXml = textXml + "</note>";
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 API手冊
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內容讀取
<description>
A cool demo
</description>
// The text is directly available
// Returns "\n A cool demo\n"
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("<xml> content");
4.CDATA的數據寫入、讀出
element.addContent(new CDATA("<xml> content"));
String noDifference = element.getText();
混合內容
element可能包含很多種內容,比如說
<table>
<!-- Some comment -->
Some text
<tr>Some child element</tr>
</table>
取table的子元素tr
String text = table.getTextTrim();
Element tr = table.getChild("tr");
也可使用另外一個比較簡單的方法
List mixedCo = table.getContent();
Iterator itr = mixedCo.iterator();
while (itr.hasNext()) {
Object o = i.next();
if (o instanceof Comment) {
...
}
// 這里可以寫成Comment, Element, Text, CDATA,ProcessingInstruction, 或者是EntityRef的類型
}
// 現在移除Comment,注意這里游標應為1。這是由于回車鍵也被解析成Text類的緣故,所以Comment項應為1。
mixedCo.remove(1);
4.Attribute類
<table width="100%" border="0"> </table>
//獲得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的例子
<?br?>
<?cocoon-process type="xslt"?>
| |
| |
目標 數據
處理目標名稱(Target)
String target = pi.getTarget();
獲得所有數據(data),在目標(target)以后的所有數據都會被返回。
String data = pi.getData();
獲得指定屬性的數據
String type = pi.getValue("type");
獲得所有屬性的名稱
List ls = pi.getNames();