一.简介
JDOM是基于Java2的API,它用Java的数据类型来定义操作数据树的各个节点...呵,就是这样,还是看怎么用它来解析XML文档吧^_^
二.API
JDOM的API还是很简单的,数量也不多,通过看方法的名字就能知道他们的作用。在这里就不罗列了,需要完整最新的API参考,可以到 http://www.jdom.org网站查看。
三.解析实例
JDOM提供了很多操作节点非常方便有效的方法,因此能很轻松的读取,修改XML文档。下面这个例子是修改bigmouse的CAD成绩,然后添加一条新学生资料。
---------- MyJDOM.java ----------
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());
}
}
}
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 >
<! 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。