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。

發佈了15 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章