以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 Java/Eclipse 』  (http://bbs.xml.org.cn/list.asp?boardid=41)
----  Jdom使用指南[转帖]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=41&rootid=&id=27922)


--  作者:xiongbajian
--  发布时间:2/28/2006 9:30:00 PM

--  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       包含了将jdomxml文档接口转换为其他xml文档接口

org.jdom.xpath           包含了对xml文档xpath操作的类

下面将通过一个例子介绍jdom的常用操作

生成xml文档:

下面的类将生成一个xml文档:

/*

*Createdon2004-10-9

*

*写入xml文件的例子

*/

/**

*@authorlnman

*

*Tochangethetemplateforthisgeneratedtypecommentgoto

*Window>Preferences>Java>CodeGeneration>CodeandComments

*/

importjava.io.*;

importorg.jdom.*;

importorg.jdom.output.*;

publicclassWriteXML

{

   publicvoidBuildXML()throwsException

   {

       Elementroot,student,number,name,age;

               

       root=newElement("student-info");//生成根元素:student-info  

       student=newElement("student");     //生成元素:student,该元素中将包含元素number,name,age

       number=newElement("number");

       name=newElement("name");

       age=newElement("age");

       

       Documentdoc=newDocument(root);   //将根元素植入文档doc中

       

       number.setText("001");

       name.setText("lnman");

       age.setText("24");

       student.addContent(number);

       student.addContent(name);

       student.addContent(age);

       root.addContent(student);

       

       Formatformat=Format.getCompactFormat();

       format.setEncoding("gb2312");          //设置xml文件的字符为gb2312

       format.setIndent("   ");              //设置xml文件的缩进为4个空格

       

       XMLOutputterXMLOut=newXMLOutputter(format);//在元素后换行,每一层元素缩排四格

       XMLOut.output(doc,newFileOutputStream("studentinfo.xml"));

       

   }

   

   publicstaticvoidmain(String[]args)throwsException

   {

       WriteXMLw=newWriteXML();

       System.out.println("NowwebuildanXMLdocument.....");

       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文档的例子:

/*

*Createdon2004-10-9

*

*用jdom读取xml文档的例子

*

*/

/**

*@authorlnman

*

*Tochangethetemplateforthisgeneratedtypecommentgoto

*Window&gt;Preferences&gt;Java&gt;CodeGeneration&gt;CodeandComments

*/

importorg.jdom.output.*;

importorg.jdom.input.*;

importorg.jdom.*;

importjava.io.*;

importjava.util.*;

publicclassReadXML

{

   

   publicstaticvoidmain(String[]args)throwsException

   {

       

       

       SAXBuilderbuilder=newSAXBuilder();

       Documentread_doc=builder.build("studentinfo.xml");

       Elementstu=read_doc.getRootElement();

       Listlist=stu.getChildren("student");

       for(inti=0;i<list.size();i++)

       {

           Elemente=(Element)list.get(i);

           Stringstr_number=e.getChildText("number");

           Stringstr_name=e.getChildText("name");

           Stringstr_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.*;

/**
* <p><code>XPathReader</code> demonstrates how to
*   read a Servlet 2.2 Web Archive file using XPath.
* </p>
*
* @author Jason Hunter
* @version 1.0
*/
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


(http://hostchains.com/community/forums/147705/printpost.aspx)


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms