对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文档:
/*
*Created on 2004-10-9
*
*写入xml文件的例子
*/
/**
* @authorlnman
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>CodeGeneration>Code and Comments
*/
import java.io.*;
import org.jdom.*;
import org.jdom.output.*;
public classWriteXML
{
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 = newDocument(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= newXMLOutputter(format);//在元素后换行,每一层元素缩排四格
XMLOut.output(doc, new FileOutputStream("studentinfo.xml"));
}
public static voidmain(String[] args)throws Exception
{
WriteXML w = newWriteXML();
System.out.println("Nowwe build an XML document .....");
w.BuildXML();
System.out.println("finished!");
}
}
生成的xml文档为:
<?xmlversion="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文档的例子
*
*/
/**
* @authorlnman
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>CodeGeneration>Code and Comments
*/
import org.jdom.output.*;
import org.jdom.input.*;
import org.jdom.*;
import java.io.*;
import java.util.*;
public classReadXML
{
public static voidmain(String[] args)throws Exception
{
SAXBuilder builder= newSAXBuilder();
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(Stringxpath)得到XPath对象,然后调用它的selectNodes(Objectcontext)方法或selectSingleNode(Objectcontext)方法,前者根据xpath语句返回一组节点(List对象);后者根据一个xpath语句返回符合条件的第一个节点(Object类型)。请看jdom-1.0自带的范例程序:
它分析在web.xml文件中的注册的servlet的个数及参数个数,并输出角色名。
web.xml文件:
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<!--
<!DOCTYPEweb-app
PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.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>Theinitialvalueforthecounter<!--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>
处理程序:
importjava.io.*;
importjava.util.*;
importorg.jdom.*;
importorg.jdom.input.*;
importorg.jdom.output.*;
importorg.jdom.xpath.*;
/**
*<p><code>XPathReader</code>demonstrateshowto
*readaServlet2.2WebArchivefileusingXPath.
*</p>
*
*@authorJasonHunter
*@version1.0
*/
publicclassXPathReader{
publicstaticvoidmain(String[]args)throwsIOException,JDOMException{
if(args.length!=1){
System.err.println("Usage:javaXPathReaderweb.xml");
return;
}
Stringfilename=args[0];//从命令行输入web.xml
PrintStreamout=System.out;
SAXBuilderbuilder=newSAXBuilder();
Documentdoc=builder.build(newFile(filename));//得到Document对象
//Printservletinformation
XPathservletPath=XPath.newInstance("//servlet");//,选择任意路径下servlet元素
Listservlets=servletPath.selectNodes(doc);//返回所有的servlet元素。
out.println("ThisWARhas"+servlets.size()+"registeredservlets:");
Iteratori=servlets.iterator();
while(i.hasNext()){//输出servlet信息
Elementservlet=(Element)i.next();
out.print("/t"+servlet.getChild("servlet-name")
.getTextTrim()+
"for"+servlet.getChild("servlet-class")
.getTextTrim());
ListinitParams=servlet.getChildren("init-param");
out.println("(ithas"+initParams.size()+"initparams)");
}
//Printsecurityroleinformation
XPathrolePath=XPath.newInstance("//security-role/role-name/text()");
ListroleNames=rolePath.selectNodes(doc);//得到所有的角色名
if(roleNames.size()==0){
out.println("ThisWARcontainsnoroles");
}else{
out.println("ThisWARcontains"+roleNames.size()+"roles:");
i=roleNames.iterator();
while(i.hasNext()){//输出角色名
out.println("/t"+((Text)i.next()).getTextTrim());
}
}
}
}
输出结果:
C:/java>javaXPathReaderweb.xml
ThisWARhas2registeredservlets:
snoopforSnoopServlet(ithas0initparams)
fileforViewFile(ithas1initparams)
ThisWARcontains3roles:
manager
director
president