??xml version="1.0" encoding="utf-8" standalone="yes"?>
?JDOM 中,XML 元素是 Element 的实例,XML 属性就?Attribute 的实例,XML 文档本n是 Document 的实例?br /> 因ؓ JDOM 对象是?Document、Element ?Attribute q些cȝ直接实例Q因此创Z个新 JDOM 对象如?Java 语言中?new 操作W一样容易。JDOM 的用是直截了当的?br /> JDOM 使用标准?Java ~码模式。只要有可能Q它使用 Java new 操作W而不故弄玄虚使用复杂的工厂化模式Q对象操作即便对于初学用户也很方便?br />
本文分两步对JDOM的应用加以介l:XML创徏 ?XML解析
一、XML文档创徏
我们由零开始利用JDOM生成一个XML文档。最后的l果(h文档)看v来象q样Q?br /> <?xml version="1.0" encoding="UTF-8"?>
<MyInfo comment="introduce myself">
<name>kingwong</name>
<sex value="male"/>
<contact>
<telephone>87654321</telephone>
</contact>
</MyInfo>
1.?MyInfo 为根元素创徏文档
Element rootElement = new Element("MyInfo");//所有的XML元素都是 Element 的实例。根元素也不例外Q)
Document myDocument = new Document(rootElement);//以根元素作ؓ参数创徏Document对象。一个Document只有一个根Q即root元素?br /> 2.l根元素d属?br /> Attribute rootAttri = new Attribute("comment","introduce myself");//创徏名ؓ commnet,gؓ introduce myself 的属性?br /> rootElement.setAttribute(rootAttri);//刚创徏的属性添加到根元素?br /> q两行代码你也可以合成一行来写,象这P
rootElement.setAttribute(new Attribute("comment","introduce myself"));
或?br /> rootElement.setAttribute("comment","introduce myself");
3.d元素和子元素
JDOM里子元素是作?contentQ内容)d到父元素里面ȝ,所谓content是cM上面h文档?lt;name></name>之间的东东,即kingwong。罗嗦了Ҏ吧:Q?br /> Element nameElement = new Element("name");//创徏 name 元素
nameElement.addContent("kingwong");//kingwong作ؓcontentd到name元素
rootElement.addContent(nameElement);//name元素作ؓcontentd到根元素
q三行你也可以合Z句,象这P
rootElement.addContent((Content)(new Element("name").addContent("kingwong")));//因ؓaddContent(Content child)Ҏq回的是一个Parent接口Q而Elementcd时承了Contentcd实现了Parent接口Q所以我们把它造型成Content?br />
我们用同LҎd带属性的子元?lt;sex value="male"/>
rootElement.addContent(new Element("sex").setAttribute("value","male"));//注意q里不需要{型,因ؓaddAttribute(String name,String value)q回值就是一?Element?br />
同样的,我们d<contract />元素到根元素下,用法上一P只是E微复杂了一些:
rootElement.addContent((Content)(new Element("contact").addContent((Content)(new Element("telephone").addContent("87654321")))));
如果你对q种写Ş式还不太习惯Q你完全可以分步来做Q就象本节刚开始的时候一栗事实上如果层次比较多,写成分步的Ş式更清晰些,也不Ҏ出错?br /> 4.删除子元?br /> q个操作比较单:
rootElement.removeChild("sex");//该方法返回一个布?br />
到目前ؓ止,我们学习了一下JDOM文档生成操作。上面徏立了一个样本文档,可是我们怎么知道对不对呢Q因此需要输出来看一下。我们将JDOM生成的文档输出到控制収ͼ使用 JDOM ?XMLOutputter cR?br /> 5. ?JDOM 转化?XML 文本
XMLOutputter xmlOut = new XMLOutputter(" ",true);
try {
xmlOut.output(myDocument,System.out);
} catch (IOException e) {
e.printStackTrace();
}
XMLOutputter 有几个格式选项。这里我们已指定希望子元素从父元素羃q两个空|q且希望元素间有I?br /> new XMLOutputter(java.lang.String indent, boolean newlines)q个Ҏ在最新版本中已经不徏议用。JDOM有一个专门的用来定义格式化输出的c:org.jdom.output.FormatQ如果你没有Ҏ的要求,有时候用里面的几个静态方法(应该可以说是预定义格式)?getPrettyFormat()可以了。我们把上面的输出格式稍微改一下,pq样Q?br /> XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
6.JDOM文档转化为其他Ş?br /> XMLOutputter q可输出?Writer ?OutputStream。ؓ了输出JDOM文档C个文本文Ӟ我们可以q样做:
FileWriter writer = new FileWriter("/some/directory/myFile.xml");
outputter.output(myDocument, writer);
writer.close();
XMLOutputter q可输出到字W串,以便E序后面q行再处?
Strng outString = xmlOut.outputString(myDocument);
当然Q在输出的时候你不一定要输出所有的整个文档Q你可以选择元素q行输出Q?br /> xmlOut.output(rootElement.getChild("name"),System.out);
一句话QJDOM非常灉|方便Q如果你惌一步研IJDOMQ请到官方网站去看一看:http://www.jdom.org
本节CZ源码Q?br />package com.cyberobject.study;
import java.io.IOException;
import org.jdom.Attribute;
import org.jdom.Content;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
/**
* @author kingwong
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class TestJDOM {
public static void main(String[] args)
{
Element rootElement = new Element("MyInfo");
Document myDocument = new Document(rootElement);
// Attribute rootAttri = new Attribute("comment","introduce myself");
// rootElement.setAttribute(rootAttri);
rootElement.setAttribute("comment","introduce myself");
//rootElement.setAttribute(new Attribute("comment","introduce myself"));
// Element sexElement = new Element("sex");
// rootElement.addContent(sexElement);
// Element nameElement = new Element("name");
// nameElement.addContent("kingwong");
// rootElement.addContent(nameElement);
rootElement.addContent((Content)(new Element("name").addContent("kingwong")));
rootElement.addContent(new Element("sex").setAttribute("value","male"));
rootElement.addContent((Content)(new Element("contract").addContent((Content)(new Element("telephone").addContent("87654321")))));
rootElement.removeChild("sex");
XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
try {
xmlOut.output(myDocument,System.out);
//xmlOut.output(rootElement.getChild("name"),System.out);
//String outString = xmlOut.outputString(myDocument);
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、XML文档解析
JDOM 不光可以很方便的建立XML文档Q它的另一个用处是它能够读取ƈ操作现有?XML 数据?br /> JDOM的解析器在org.jdom.input.*q个包里Q其中的DOMBuilder的功能是DOM模型的Document解析成JDOM模型的DocumentQSAXBuilder的功能是从文件或中解析出符合JDOM模型的XML树。由于我们经常要从一个文仉d数据Q因此我们应该采用后者作析工兗?br />解析一个xml文档Q基本可以看成以下几个步骤:
1.实例化一个合适的解析器对?br /> 本例中我们用SAXBuilder:
SAXBuilder sb = new SAXBuilder();
2.以包含XML数据的文件ؓ参数Q构Z个文档对象myDocument
Document myDocument = sb.build(/some/directory/myFile.xml);
3.获到根元?br /> Element rootElement = myDocument.getRootElement();
一旦你获取了根元素Q你可以很方便地对它下面的子元素进行操作了Q下面对Element对象的一些常用方法作一下简单说明:
getChild("childname") q回指定名字的子节点,如果同一U有多个同名子节点,则只q回W一个;如果没有q回null倹{?br /> getChildren("childname") q回指定名字的子节点List集合。这样你可以遍历所有的同一U同名子节点?
getAttributeValue("name") q回指定属性名字的倹{如果没有该属性则q回null,有该属性但是gؓI,则返回空字符丌Ӏ?br /> getChildText("childname") q回指定子节点的内容文本倹{?br /> getText() q回该元素的内容文本倹{?br />
q有其他没有|列出来的方法,如果需要的话,可以随时查阅JDOM的在U文档:http://www.jdom.org/docs/apidocs/index.html。当然你可以在你需要的地方d、删除元素操作,q记得上面的创徏XML的方法吗Q呵呵~~~
学习C东还是从实例学v最为快P下面单D个例子,׃上面的XMLh代码来学习JDOM的XML解析。本例中d了样本XML文g里一些属性和contentQ最后我们还在contact元素里插入了一个新元素<email value="wanghua@cyberobject.com" />。尽我们实C对于XML的基本操作,l心的朋友可能会
有疑问:如果XML文档的层ơ稍微复杂一些,如果嵌套多达几十上百层的话(开个玩W)Q如果靠q样从根元素一U一U地通过getChild("childname")来访问子元素的话Q将会非常痛苦!是的Q的是q样Q但是我们有另一个有力的工具XPathQؓ什么不用呢Q这是后话!先卖个关子(手敲累啦Q下回吧Q呵呵)?br />
/*
* Created on 2004-8-21
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package com.cyberobject.study;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
/**
* @author kingwong
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class TestJDOM2 {
public static void main(String[] args){
SAXBuilder sb = new SAXBuilder();
try
{
Document doc = sb.build("myFile.xml");
Element root = doc.getRootElement();
String str1 = root.getAttributeValue("comment");
System.out.println("Root Element's comment attribute is : " + str1);
String str2 = root.getChild("sex").getAttributeValue("value");
System.out.println("sex Element's value attribute is : " + str2);
String str3 = root.getChildText("name");
System.out.println("name Element's content is :" + str3);
String str4 = root.getChild("contact").getChildText("telephone");
System.out.println("contact Element's telephone subelement content is : " + str4 + "\n");
Element inputElement = root.getChild("contact");
inputElement.addContent(new Element("email").setAttribute("value","wanghua@cyberobject.com"));
XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
String outStr = xmlOut.outputString(root);
System.out.println(outStr);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
import java.io.*; import java.net.*; public class MyServer { public static void main(String[] args) throws IOException{ ServerSocket server=new ServerSocket(5678); while(true){ Socket client=server.accept(); BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out=new PrintWriter(client.getOutputStream()); while(true){ String str=in.readLine(); System.out.println(str); out.println("has receive...."); out.flush(); if(str.equals("end")) break; } client.close(); } } } |
import java.net.*; import java.io.*; public class MultiUser extends Thread{ private Socket client; public MultiUser(Socket c){ this.client=c; } public void run(){ try{ BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out=new PrintWriter(client.getOutputStream()); //Mutil User but can parallel while(true){ String str=in.readLine(); System.out.println(str); out.println("has receive...."); out.flush(); if(str.equals("end")) break; } client.close(); }catch(IOException ex){ }finally{ } } public static void main(String[] args)throws IOException{ ServerSocket server=new ServerSocket(5678); while(true){ //transfer location change Single User or Multi User MultiUser mu=new MultiUser(server.accept()); mu.start(); } } } |
BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out=new PrintWriter(client.getOutputStream()); |
DataInputStream isFromClient = new DataInputStream(client.getInputStream()); DataOutputStream osToClient = new DataOutputStream(client.getOutputStream()); |