Jdom使用指南

對xml文檔的解析java中有很多種方法,例如使用dom、sax、jdom等等,相比之下,我覺得還是jdom比較方便。下面介紹一下jdom的基本使用方法,不對之處還請各位網友之交。謝謝!

最新的jdom可以到他的網站:http://www.jdom.org/去下載,現在的版本是1.0版,下載之後將得到jdom-1.0.zip文件,解壓後進入build文件夾將看到一個名爲jdom.jar的包,這個就是jdom的類包了,將它加到你的classpath裏就可以使用jdom提供的各種處理xml的類和他們的方法了。應該注意的是在解壓後的文件夾裏還有一個lib文件夾,裏面保存的是使用jdom的環境包,不過我在我的jdk1.4下使用沒引用這些包一樣好用,不知道是jdk1.4中已經包含了這些東西還是原來我的eclipse已經引用了這些包,呵呵。

好了,書歸正傳,現在開始介紹jdom包的使用。

jdom包的結構包括:

org.jdom 包含了所有的xml文檔要素的java類


org.jdom.adapters 包含了與dom適配的java類

org.jdom.filter 包含了xml文檔的過濾器類

org.jdom.input 包含了讀取xml文檔的類

org.jdom.output 包含了寫入xml文檔的雷

org.jdom.transform 包含了將jdom xml文檔接口轉換爲其他xml文檔接口

org.jdom.xpath 包含了對xml文檔xpath操作的類

下面將通過一個例子介紹jdom的常用操作

生成xml文檔:
下面的類將生成一個xml文檔:
import java.io.*;
import org.jdom.*;
import org.jdom.output.*;

public class WriteXML
{
public void BuildXML() throws Exception
{
Element root,student,number,name,age;

root = new Element("student-info"); //生成根元素:student-info
student = new Element("student"); //生成元素:student,該元素中將包含元素number,name,age
number = new Element("number");
name = new Element("name");
age = new Element("age");

Document doc = new Document(root); //將根元素植入文檔doc中

number.setText("001");
name.setText("lnman");
age.setText("24");
student.addContent(number);
student.addContent(name);
student.addContent(age);
root.addContent(student);

Format format = Format.getCompactFormat();
format.setEncoding("gb2312"); //設置xml文件的字符爲gb2312
format.setIndent(" "); //設置xml文件的縮進爲4個空格

XMLOutputter XMLOut = new XMLOutputter(format);//在元素後換行,每一層元素縮排四格
XMLOut.output(doc, new FileOutputStream("studentinfo.xml"));

}

public static void main(String[] args) throws Exception
{
WriteXML w = new WriteXML();
System.out.println("Now we build an XML document .....");
w.BuildXML();
System.out.println("finished!");
}

}

生成的xml文檔爲:
<?xml version="1.0" encoding="gb2312"?>

<student-info>

<student>

<number>001</number>

<name>lnman</name>

<age>24</age>

</student>

</student-info>



讀取xml文檔的例子:
/*
* Created on 2004-10-9
*
*用jdom讀取xml文檔的例子
*
*/

/**
* @author lnman
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
import org.jdom.output.*;
import org.jdom.input.*;
import org.jdom.*;
import java.io.*;
import java.util.*;
public class ReadXML
{
public static void main(String[] args) throws Exception
{
SAXBuilder builder = new SAXBuilder();
Document read_doc = builder.build("studentinfo.xml");
Element stu = read_doc.getRootElement();
List list = stu.getChildren("student");
for(int i = 0;i < list.size();i++)
{
Element e = (Element)list.get(i);
String str_number = e.getChildText("number");
String str_name = e.getChildText("name");
String str_age = e.getChildText("age");
System.out.println("---------STUDENT--------------");
System.out.println("NUMBER:" + str_number);
System.out.println("NAME:" + str_name);
System.out.println("AGE:" + str_age);
System.out.println("------------------------------");
System.out.println();
}
}
}


Xpath例子:
JDOM的關於XPATH的api在org.jdom.xpath這個包裏。這個包下,有一個抽象類XPath.java和實現類JaxenXPath.java, 使用時先用XPath類的靜態方法newInstance(String xpath)得到XPath對象,然後調用它的selectNodes(Object context)方法或selectSingleNode(Object context)方法,前者根據xpath語句返回一組節點(List對象);後者根據一個xpath語句返回符合條件的第一個節點(Object類型)。請看jdom-1.0自帶的範例程序:
它分析在web.xml文件中的註冊的servlet的個數及參數個數,並輸出角色名。
web.xml文件:
<?xml version="1.0" encoding="ISO-8859-1"?> 
<!--
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
-->

<web-app>
<servlet>
<servlet-name>snoop</servlet-name>
<servlet-class>SnoopServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>file </servlet-name>
<servlet-class>ViewFile</servlet-class>
<init-param>
<param-name>initial</param-name>
<param-value>1000</param-value>
<description>The initial value for the counter <!-- optional --></description>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mv</servlet-name>
<url-pattern>*.wm</url-pattern>
</servlet-mapping>
<distributed/>

<security-role>
<role-name>manager</role-name>
<role-name>director</role-name>
<role-name>president</role-name>
</security-role>
</web-app>



處理程序:
import java.io.*; 
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
import org.jdom.xpath.*;
public class XPathReader {

public static void main(String[] args) throws IOException, JDOMException {
if (args.length != 1) {
System.err.println("Usage: java XPathReader web.xml");
return;
}
String filename = args[0];//從命令行輸入web.xml
PrintStream out = System.out;
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File(filename));//得到Document對象
// Print servlet information
XPath servletPath = XPath.newInstance("//servlet");//,選擇任意路徑下servlet元素
List servlets = servletPath.selectNodes(doc);//返回所有的servlet元素。
out.println("This WAR has "+ servlets.size() +" registered servlets:");
Iterator i = servlets.iterator();
while (i.hasNext()) {//輸出servlet信息
Element servlet = (Element) i.next();
out.print("\t" + servlet.getChild("servlet-name")
.getTextTrim() +
" for " + servlet.getChild("servlet-class")
.getTextTrim());
List initParams = servlet.getChildren("init-param");
out.println(" (it has " + initParams.size() + " init params)");
}

// Print security role information
XPath rolePath = XPath.newInstance("//security-role/role-name/text()");
List roleNames = rolePath.selectNodes(doc);//得到所有的角色名
if (roleNames.size() == 0) {
out.println("This WAR contains no roles");
} else {
out.println("This WAR contains " + roleNames.size() + " roles:");
i = roleNames.iterator();
while (i.hasNext()) {//輸出角色名
out.println("\t" + ((Text)i.next()).getTextTrim());
}
}
}
}

輸出結果:
C:\java>java XPathReader web.xml
This WAR has 2 registered servlets:
snoop for SnoopServlet (it has 0 init params)
file for ViewFile (it has 1 init params)
This WAR contains 3 roles:
manager
director
president
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章