JDOM是基於Java2的API,它用Java的數據類型來定義操作數據樹的各個節點...呵,就是這樣,還是看怎麼用它來解析XML文檔吧^_^
二.API
JDOM的API還是很簡單的,數量也不多,通過看方法的名字就能知道他們的作用。在這裏就不羅列了,需要完整最新的API參考,可以到http://www.jdom.org網站查看。
三.解析實例
JDOM提供了很多操作節點非常方便有效的方法,因此能很輕鬆的讀取,修改XML文檔。下面這個例子是修改bigmouse的CAD成績,然後添加一條新學生資料。
---------- MyJDOM.java ----------
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 ----------
<!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。