JDOM

一.简介
  
  JDOM是基于Java2的API,它用Java的数据类型来定义操作数据树的各个节点...呵,就是这样,还是看怎么用它来解析XML文档吧^_^

二.API

  JDOM的API还是很简单的,数量也不多,通过看方法的名字就能知道他们的作用。在这里就不罗列了,需要完整最新的API参考,可以到 http://www.jdom.org网站查看。


三.解析实例

  JDOM提供了很多操作节点非常方便有效的方法,因此能很轻松的读取,修改XML文档。下面这个例子是修改bigmouse的CAD成绩,然后添加一条新学生资料。

---------- MyJDOM.java ----------
import  org.jdom. * ;
import  org.jdom.input. * ;
import  org.jdom.output. * ;
import  java.util. * ;
import  java.io. * ;

public   class  MyJDOM
{

  
public MyJDOM()
  
{
  }


  
public static void main(String[] args)
  
{
    
if (args.length != 1)
    
{
      System.out.println(
"Usage:java MyJDOM [XML file URI]");
    }


    MyJDOM myJDOM 
= new MyJDOM();
    myJDOM.parserXMLFile(args[
0]);
  }


  
/**
   * 解析文档
   * 
@param fileURI
   
*/

  
private void parserXMLFile(String fileURI)
  
{
    
try
    
{
      
//获得org.jdom.input.SAXBuilder的一个实例,用来获得XML文档。
      
//参数false表示不进行验证。
      
//参数中没有指定使用什么解析器,因此使用默认的解析器。
      SAXBuilder builder = new SAXBuilder(false);
      
//得到Document
      Document doc = builder.build(fileURI);
      
//名字空间
      Namespace ns = Namespace.getNamespace("LIT""http://www.lit.edu.cn/student/");
      
//得到根节点LIT:StuInfo
      Element elmtStuInfo = doc.getRootElement();
      
//取得所有LIT:student节点的集合
      List lstStudents = elmtStuInfo.getChildren("student", ns);
      
//修改bigmouse的CAD分数
      for (int i = 0; i < lstStudents.size(); i++)
      
{
        
//当前学生节点
        Element elmtStudent = (Element)lstStudents.get(i);

        
if (elmtStudent.getChildTextTrim("name", ns).equals("bigmouse"))
        
{
          
//所有课程节点的集合
          List lstLesson = elmtStudent.getChildren("lesson", ns);

          
for (int j = 0; j < lstLesson.size(); j++)
          
{
            Element elmtLesson 
= (Element)lstLesson.get(j);

            
if (elmtLesson.getChildTextTrim("lessonName", ns).equals("autoCAD"))
            
{
              
//修改CAD分数,100分 @_@
              elmtLesson.getChild("lessonScore", ns).setText("100");
              System.out.println(
"** autoCAD:100");
            }

          }

        }
//end if
      }
//end for

      
//添加一条学生记录
      elmtStuInfo.addContent(new Element("student", ns).addContent(new Element("name", ns).setText("fannWong"))
                                                      .addContent(
new Element("sex", ns).setText("female"))
                                                      .addContent(
new Element("lesson", ns).addContent(new Element("lessonName", ns).setText("math"))
                                                                                          .addContent(
new Element("lessonScore", ns).setText("85")))
                                                      .addContent(
new Element("lesson", ns).addContent(new Element("lessonName", ns).setText("English"))
                                                                                          .addContent(
new Element("lessonScore", ns).setText("95"))))
                .addContent(
new Element("breakLine", ns));

      System.out.println(
"** New Element added!");

      
//调整一下格式,把实体引用放到最后面
      
//先删除,后追加。
      elmtStuInfo.removeChild("master", ns);
      elmtStuInfo.addContent(
new Element("master", ns).addContent(new Entity("masterName")));

      
//输出文档
      
//第一个参数是缩进字符串,这里是4个空格。
      
//第二个参数是true,表示需要换行。
      XMLOutputter printDoc = new XMLOutputter("    "true);
      printDoc.output(doc, 
new FileOutputStream("StuInfo.xml"));
    }

    
catch (JDOMException jdome)
    
{
      System.out.println(jdome.getMessage());
    }

    
catch (FileNotFoundException fnfe)
    
{
      System.out.println(fnfe.getMessage());
    }

    
catch (IOException ioe)
    
{
      System.out.println(ioe.getMessage());
    }

  }

}

 

---------- 改变后的 StuInfo.dtd ----------

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE LIT:StuInfo SYSTEM "dtdstudent.dtd" >
<? xml-stylesheet href="xslStuInfo.xsl" type="text/xsl" ?>
< LIT:StuInfo  xmlns:LIT ="http://www.lit.edu.cn/student/" >
    
< LIT:student >
        
< LIT:name > bigmouse </ LIT:name >
        
< LIT:sex > male </ LIT:sex >
        
< LIT:lesson >
            
< LIT:lessonName > math </ LIT:lessonName >
            
< LIT:lessonScore > 60 </ LIT:lessonScore >
        
</ LIT:lesson >
        
< LIT:lesson >
            
< LIT:lessonName > Englist </ LIT:lessonName >
            
< LIT:lessonScore > 59 </ LIT:lessonScore >
        
</ LIT:lesson >
        
< LIT:lesson >
            
< LIT:lessonName > autoCAD </ LIT:lessonName >
            
< LIT:lessonScore > 100 </ LIT:lessonScore >
        
</ LIT:lesson >
        
< LIT:lesson >
            
< LIT:lessonName > SCM </ LIT:lessonName >
            
< LIT:lessonScore > 90 </ LIT:lessonScore >
        
</ LIT:lesson >
        
< LIT:lesson >
            
< LIT:lessonName > mechanics </ LIT:lessonName >
            
< LIT:lessonScore > 61 </ LIT:lessonScore >
        
</ LIT:lesson >
    
</ LIT:student >
    
< LIT:breakLine  />
    
< LIT:student >
        
< LIT:name > coco </ LIT:name >
        
< LIT:sex > female </ LIT:sex >
        
< LIT:lesson >
            
< LIT:lessonName > math </ LIT:lessonName >
            
< LIT:lessonScore > 90 </ LIT:lessonScore >
        
</ LIT:lesson >
        
< LIT:lesson >
            
< LIT:lessonName > Englist </ LIT:lessonName >
            
< LIT:lessonScore > 95 </ LIT:lessonScore >
        
</ LIT:lesson >
        
< LIT:lesson >
            
< LIT:lessonName > C++ </ LIT:lessonName >
            
< LIT:lessonScore > 80 </ LIT:lessonScore >
        
</ LIT:lesson >
        
< LIT:lesson >
            
< LIT:lessonName > Java </ LIT:lessonName >
            
< LIT:lessonScore > 85 </ LIT:lessonScore >
        
</ LIT:lesson >
    
</ LIT:student >
    
< LIT:breakLine  />
    
< LIT:student >
        
< LIT:name > fannWong </ LIT:name >
        
< LIT:sex > female </ LIT:sex >
        
< LIT:lesson >
            
< LIT:lessonName > math </ LIT:lessonName >
            
< LIT:lessonScore > 85 </ LIT:lessonScore >
        
</ LIT:lesson >
        
< LIT:lesson >
            
< LIT:lessonName > English </ LIT:lessonName >
            
< LIT:lessonScore > 95 </ LIT:lessonScore >
        
</ LIT:lesson >
    
</ LIT:student >
    
< LIT:breakLine  />
    
< LIT:master >
&masterName;      </ LIT:master >
</ LIT:StuInfo >

 四.其他
  
  也没什么其他的了,下次介绍XSP,这可是好东东,跟ASP,PHP,JSP类似,不过是用XML+Java来写网页,而且在逻辑与表现的分离上作的比JSP还要彻底。。。不过要说到分离最彻底的恐怕要算是ASP.NET的Codebehind吧,以后有机会再写ASP.NET和XML结合的例子。。。下次XSP。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值