




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JDOM使用详解及实例作者:佚名 文章来源:不详 点击数:12 更新时间:2008-4-11 % if request(infoid) then set rs=conn.execute(select * from nproduct where id=&request(infoid) if not (rs.eof and rs.bof) then proname=rs(proname) content=rs(proinfo) end if rs.close set rs=nothing end if %一、JDOM 简介JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现
2、解析、生成、序列化以及多种操作。JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter开发出来,以弥补DOM及SAX在实际应用当中的不足之处。这些不足之处主要在于SAX没有文档修改、随机访问以及输出的功能,而对于DOM来说,JAVA程序员在使用时来用起来总觉得不太方便。DOM的缺点主要是来自于由于Dom是一个接口定义
3、语言(IDL),它的任务是在不同语言实现中的一个最低的通用标准,并不是为JAVA特别设计的。JDOM的最新版本为JDOM Beta 9。最近JDOM被收录到JSR-102内,这标志着JDOM成为了JAVA平台组成的一部分。二、JDOM 包概览JDOM是由以下几个包组成的org.jdom 包含了所有的xml文档要素的java类 org.jdom.adapters 包含了与dom适配的java类 org.jdom.filter 包含了xml文档的过滤器类 org.jdom.input 包含了读取xml文档的类 org.jdom.output 包含了写入xml文档的类 org.jdom.transf
4、orm 包含了将jdom xml文档接口转换为其他xml文档接口 org.jdom.xpath 包含了对xml文档xpath操作的类三、JDOM 类说明1、org.JDOM这个包里的类是你J解析xml文件后所要用到的所有数据类型。AttributeCDATAComentDocTypeDocumentElementEntityRefNamespaceProscessingInstructionText2、org.JDOM.transform在涉及xslt格式转换时应使用下面的2个类JDOMSourceJDOMResultorg.JDOM.input3、输入类,一般用于文档的创建工作SAXBuil
5、derDOMBuilderResultSetBuilderorg.JDOM.output4、输出类,用于文档转换输出XMLOutputterSAXOutputterDomOutputterJTreeOutputter使用前注意事项:1.JDOM对于JAXP 以及 TRax 的支持JDOM 支持JAXP1.1:你可以在程序中使用任何的parser工具类,默认情况下是JAXP的parser。制定特别的parser可用如下形式SAXBuilder parser = new SAXBuilder(org.apache.crimson.parser.XMLReaderImpl); Document do
6、c = parser.build(/); / work with the document.JDOM也支持TRaX:XSLT可通过JDOMSource以及JDOMResult类来转换(参见以后章节)2.注意在JDOM里文档(Document)类由org.JDOM.Document 来表示。这要与org.w3c.dom中的Document区别开,这2种格式如何转换在后面会说明。以下如无特指均指JDOM里的Document。四、JDOM主要使用方法1.Ducument类(1)Document的操作方法:Element root = new Ele
7、ment(GREETING);Document doc = new Document(root);root.setText(Hello JDOM!);或者简单的使用Document doc = new Document(new Element(GREETING).setText(Hello JDOM!t);这点和DOM不同。Dom则需要更为复杂的代码,如下:DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();DocumentBuilder builder =factory.newDocumentBuilder
8、();Document doc = builder.newDocument();Element root =doc.createElement(root);Text text = doc.createText(This is the root);root.appendChild(text);doc.appendChild(root);注意事项:JDOM不允许同一个节点同时被2个或多个文档相关联,要在第2个文档中使用原来老文档中的节点的话。首先需要使用detach()把这个节点分开来。(2)从文件、流、系统ID、URL得到Document对象:DOMBuilder builder = new D
9、OMBuilder();Document doc = builder.build(new File(jdom_test.xml);SAXBuilder builder = new SAXBuilder();Document doc = builder.build(url);在新版本中DOMBuilder 已经Deprecated掉 DOMBuilder.builder(url),用SAX效率会比较快。这里举一个小例子,为了简单起见,使用String对象直接作为xml数据源: public jdomTest() String textXml = null; textXml = ; textXml
10、 = textXml + aaabbbcccddd; textXml = textXml + ; SAXBuilder builder = new SAXBuilder(); Document doc = null; Reader in= new StringReader(textXml); try doc = builder.build(in); Element root = doc.getRootElement(); List ls = root.getChildren();/注意此处取出的是root节点下面的一层的Element集合 for (Iterator iter = ls.ite
11、rator(); iter.hasNext(); ) Element el = (Element) iter.next(); if(el.getName().equals(to) System.out.println(el.getText(); catch (IOException ex) ex.printStackTrace(); catch (JDOMException ex) ex.printStackTrace(); (3)DOM的document和JDOM的Document之间的相互转换使用方法,简单!DOMBuilder builder = new DOMBuilder();org
12、.jdom.Document jdomDocument = builder.build(domDocument);DOMOutputter converter = new DOMOutputter();/ work with the JDOM documentorg.w3c.dom.Document domDocument = converter.output(jdomDocument);/ work with the DOM document2.XML文档输出XMLOutPutter类:JDOM的输出非常灵活,支持很多种io格式以及风格的输出Document doc = new Docume
13、nt(.);XMLOutputter outp = new XMLOutputter();outp.output(doc, fileOutputStream); / Raw outputoutp.setTextTrim(true); / Compressed outputoutp.output(doc, socket.getOutputStream();outp.setIndent( );/ Pretty outputoutp.setNewlines(true);outp.output(doc, System.out);详细请参阅最新的JDOM API手册3.Element 类:(1)浏览El
14、ement树Element root = doc.getRootElement();/获得根元素elementList allChildren = root.getChildren();/ 获得所有子元素的一个listList namedChildren = root.getChildren(name);/ 获得指定名称子元素的listElement child = root.getChild(name);/获得指定名称的第一个子元素JDOM给了我们很多很灵活的使用方法来管理子元素(这里的List是java.util.List)List allChildren = root.getChildr
15、en();allChildren.remove(3); / 删除第四个子元素allChildren.removeAll(root.getChildren(jack);/ 删除叫“jack”的子元素root.removeChildren(jack); / 便捷写法allChildren.add(new Element(jane);/ 加入root.addContent(new Element(jane); / 便捷写法allChildren.add(0, new Element(first);(2)移动Elements:在JDOM里很简单Element movable = new Element
16、(movable);parent1.addContent(movable); / placeparent1.removeContent(movable); / removeparent2.addContent(movable); / add在Dom里Element movable = doc1.createElement(movable);parent1.appendChild(movable); / placeparent1.removeChild(movable); / removeparent2.appendChild(movable); / 出错!补充:纠错性JDOM的Element构
17、造函数(以及它的其他函数)会检查element是否合法。而它的add/remove方法会检查树结构,检查内容如下:1.在任何树中是否有回环节点2.是否只有一个根节点3.是否有一致的命名空间(Namespaces)(3)Element的text内容读取A cool demo/ The text is directly available/ Returns n A cool demonString desc = element.getText();/ Theres a convenient shortcut/ Returns A cool demoString desc = element.get
18、TextTrim();(4)Elment内容修改element.setText(A new description);3.可正确解释特殊字符element.setText( content);4.CDATA的数据写入、读出element.addContent(new CDATA( content);String noDifference = element.getText();混合内容element可能包含很多种内容,比如说Some textSome child element取table的子元素trString text = table.getTextTrim();Element tr =
19、table.getChild(tr);也可使用另外一个比较简单的方法List mixedCo = table.getContent();Iterator itr = mixedCo.iterator();while (itr.hasNext() Object o = i.next();if (o instanceof Comment) ./ 这里可以写成Comment, Element, Text, CDATA,ProcessingInstruction, 或者是EntityRef的类型/ 现在移除Comment,注意这里游标应为1。这是由于回车键也被解析成Text类的缘故,所以Comment
20、项应为1。mixedCo.remove(1);4.Attribute类 String width = table.getAttributeValue(width);/获得attributeint border = table.getAttribute(width).getIntValue();table.setAttribute(vspace, 0);/设置attributetable.removeAttribute(vspace);/ 删除一个或全部attributetable.getAttributes().clear();5.处理指令(Processing Instructions)操作
21、一个Pls的例子 | | | | 目标 数据处理目标名称(Target)String target = pi.getTarget();获得所有数据(data),在目标(target)以后的所有数据都会被返回。String data = pi.getData();String type = pi.getValue(type);获得指定属性的数据List ls = pi.getNames();获得所有属性的名称6.命名空间操作Home PageNamespace xhtml = Namespace.getNamespace(xhtml, /1999/xhtml);L
22、ist kids = html.getChildren(title, xhtml);Element kid = html.getChild(title, xhtml);kid.addContent(new Element(table, xhtml);7.XSLT格式转换使用以下函数可对XSLT转换最后如果你需要使用w3c的Document则需要转换一下。public static Document transform(String stylesheet,Document in) throws JDOMException try Transformer transformer = Transfo
23、rmerFactory.newInstance() .newTransformer(new StreamSource(stylesheet); JDOMResult out = new JDOMResult(); transformer.transform(new JDOMSource(in), out); return out.getDeocument(); catch (TransformerException e) throw new JDOMException(XSLT Trandformation failed, e); 五、用例:1、生成xml文档: public class Wr
24、iteXML public void BuildXML() throws Exception Element root,student,number,name,age; root = new Element(student-info); /生成根元素:student-info student = new Element(student); /生成元素:student(number,name,age) number = new Element(number); name = new Element(name); age = new Element(age); Document doc = new
25、 Document(root); /将根元素植入文档doc中 number.setText(001); name.setText(lnman); age.setText(24); student.addContent(number); student.addContent(name); student.addContent(age); root.addContent(student); Format format = Format.getCompactFormat(); format.setEncoding(gb2312); /设置xml文件的字符为gb2312 format.setInden
26、t( ); /设置xml文件的缩进为4个空格 XMLOutputter XMLOut = new XMLOutputter(format);/元素后换行一层元素缩四格 XMLOut.output(doc, new FileOutputStream(studentinfo.xml); public static void main(String args) throws Exception WriteXML w = new WriteXML(); System.out.println(Now we build an XML document .); w.BuildXML(); System.ou
27、t.println(finished!);生成的xml文档为: 001 lnman 24 创建XML文档2: public class CreateXML public void Create() try Document doc = new Document(); ProcessingInstruction pi=new ProcessingInstruction(xml-stylesheet,type=text/xsl href=test.xsl); doc.addContent(pi); Namespace ns = Namespace.getNamespace(http:/www.br
28、 ); Namespace ns2 = Namespace.getNamespace(other, ); Element root = new Element(根元素, ns); root.addNamespaceDeclaration(ns2); doc.setRootElement(root); Element el1 = new Element(元素一); el1.setAttribute(属性, 属性一); Text text1=new Text(元素值); Element em = new Element(元素二).addConte
29、nt(第二个元素); el1.addContent(text1); el1.addContent(em); Element el2 = new Element(元素三).addContent(第三个元素); root.addContent(el1); root.addContent(el2); /缩进四个空格,自动换行,gb2312编码 XMLOutputter outputter = new XMLOutputter( , true,GB2312); outputter.output(doc, new FileWriter(test.xml); catch(Exception e) Syst
30、em.out.println(e); public static void main(String args) new CreateXML().Create(); 2、读取xml文档的例子:import org.jdom.output.*;import org.jdom.input.*;import org.jdom.*;import java.io.*;import java.util.*;public class ReadXML public static void main(String args) throws Exception SAXBuilder builder = new SA
31、XBuilder(); Document read_doc = builder.build(studentinfo.xml); Element stu = read_doc.getRootElement(); List list = stu.getChildren(student); for(int i = 0;i list.size();i+) Element e = (Element)list.get(i); String str_number = e.getChildText(number); String str_name = e.getChildText(name); String
32、str_age = e.getChildText(age); System.out.println(-STUDENT-); System.out.println(NUMBER: + str_number); System.out.println(NAME: + str_name); System.out.println(AGE: + str_age); System.out.println(-); System.out.println(); 3、DTD验证的: public class XMLWithDTD public void validate() try SAXBuilder build
33、er = new SAXBuilder(true); builder.setFeature(/sax/features/validation;,true); Document doc = builder.build(new FileReader(author.xml); System.out.println(搞掂); XMLOutputter outputter = new XMLOutputter(); outputter.output(doc, System.out); catch(Exception e) System.out.println(e); publi
34、c static void main(String args) new XMLWithDTD().validate(); 需要说明的是,这个程序没有指明使用哪个DTD文件。DTD文件的位置是在XML中指定的,而且DTD不支持命名空间,一个XML只能引用一个DTD,所以程序直接读取XML中指定的DTD,程序本身不用指定。不过这样一来,好象就只能使用外部式的DTD引用方式了?高人指点。 4、XML Schema验证的: public class XMLWithSchema String xml=test.xml; String schema=test-schema.xml; public void
35、 validate() try SAXBuilder builder = new SAXBuilder(true); /指定约束方式为XML schema builder.setFeature(/xml/features/validation/schema;, true); /导入schema文件builder.setProperty(/xml/properties/schema/external-noNamespaceSchemaLocation;,schema); Document doc = builder.build(ne
36、w FileReader(xml); System.out.println(搞掂); XMLOutputter outputter = new XMLOutputter(); outputter.output(doc, System.out); catch(Exception e) System.out.println(验证失败:+e); 上面的程序就指出了要引入的XML Schema文件的位置。 系统默认输出是UTF-8,这有可能导致出现乱码。5、Xpath例子:JDOM的关于XPATH的api在org.jdom.xpath这个包里。这个包下,有一个抽象类XPath.java和实现类 Jax
37、enXPath.java, 使用时先用XPath类的静态方法newInstance(String xpath)得到XPath对象,然后调用它的selectNodes(Object context)方法或selectSingleNode(Object context)方法,前者根据xpath语句返回一组节点(List对象);后者根据一个xpath语句返回符合条件的第一个节点(Object类型)。请看jdom-1.0自带的范例程序: 它分析在web.xml文件中的注册的servlet的个数及参数个数,并输出角色名。web.xml文件:!- snoop SnoopServlet file ViewF
38、ile initial 1000 The initial value for the counter mv *.wm manager director president 处理程序:import java.io.*;import java.util.*; public class XPathReader public static void main(String args) throws IOException, JDOMException if (args.length != 1) System.err.println(Usage: java XPathReader web.xml); r
39、eturn; String filename = args0;/从命令行输入web.xml PrintStream out = System.out; SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(new File(filename);/得到Document对象 / Print servlet information XPath servletPath = XPath.newInstance(/servlet);/,选择任意路径下servlet元素 List servlets = servletPath.
40、selectNodes(doc);/返回所有的servlet元素。 out.println(This WAR has + servlets.size() + registered servlets:); Iterator i = servlets.iterator(); while (i.hasNext() /输出servlet信息 Element servlet = (Element) i.next(); out.print(t + servlet.getChild(servlet-name) .getTextTrim() + for + servlet.getChild(servlet-c
41、lass) .getTextTrim(); List initParams = servlet.getChildren(init-param); out.println( (it has + initParams.size() + init params); / Print security role information XPath rolePath = XPath.newInstance(/security-role/role-name/text(); List roleNames = rolePath.selectNodes(doc);/得到所有的角色名 if (roleNames.s
42、ize() = 0) out.println(This WAR contains no roles); else out.println(This WAR contains + roleNames.size() + roles:); i = roleNames.iterator(); while (i.hasNext() /输出角色名 out.println(t + (Text)i.next().getTextTrim(); 输出结果:C:javajava XPathReader web.xmlThis WAR has 2 registered servlets: snoop for SnoopServlet (it has 0 init params) file for View
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基于大数据技术的农业种植技术创新合作协议
- 清平乐村居300字(8篇)
- 作文小练笔600字15篇
- 数据挖掘技术应用推广合同
- 农村小型水利设施建设承包合同
- 2025年通化出租车资格证考试题
- 2025年肇庆道路旅客运输资格证从业考试
- 2025年山西出租车驾驶员理论考试测试题答案
- 艺术教育行业2025年在线平台用户需求研究报告
- 医疗大数据隐私保护在2025年公共卫生事件监测中的应用报告
- 新疆乌鲁木齐市重点中学2023-2024学年小升初分班考数学预测卷(人教版)
- DB6505-T 122-2021 肉牛疫病防治技术规程
- 第四章第一节《全体人民共同的价值追求》公开课教案教学设计课件资料
- 项目投资管理流程
- DB11T 381-2023 既有居住建筑节能改造技术规程
- 2023年咸阳市乾县社区工作者招聘考试真题
- 团队主管的职责课件
- 蔡司三坐标-高级培训教程
- 缺血性脑卒中静脉溶栓护理
- Web前端技术PPT完整全套教学课件
- 高校学生公寓管理规范
评论
0/150
提交评论