2008年4月21日 Edited By DingDangXiaoMa
JDOM的目的是成为
Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快
example:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
public class MyJDOM {
public MyJDOM() {
}
public static void main(String[] args) {
MyJDOM myJDOM = new MyJDOM();
myJDOM.parserXMLFile("http://localhost/example/xml/SutInfo.xml"); //这是网络上的资料,也可以定义为本地资料,采用相对路径的方式。
}
/**
* 解析文档
*
* @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("10");
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("master")); //这句话,与原始文件有所不同,但总的作用就在本末添加上一个master.
// 输出文档
// 第一个参数是缩进字符串,这里是4个空格。
// 第二个参数是true,表示需要换行。
XMLOutputter printDoc = new XMLOutputter();
printDoc.output(doc, new FileOutputStream("C:/Tomcat 6.0/webapps/struts2.0/xml/SutInfo2.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());
}
}
}
说明:
本原代码的作用是:1.读取xml文件,修改名字为bigmouse的CAD成绩。2.在末尾添加一条记录。
在读取结点时,最后的结点集全变成了java.util.List;命名空间有自己的定义类 Namespace
在jdk 中默认的没有这个包:org.jdom.*.从网上下载:
http://www.jdom.org/
本小节就到这里,有兴趣的可以分析一下原代码。 下一节 SAX方式。