﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-java-tju</title><link>http://www.blogjava.net/java-tju/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 05:16:48 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 05:16:48 GMT</pubDate><ttl>60</ttl><item><title>jdom使用指南</title><link>http://www.blogjava.net/java-tju/archive/2007/06/05/122230.html</link><dc:creator>java_tju</dc:creator><author>java_tju</author><pubDate>Tue, 05 Jun 2007 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/java-tju/archive/2007/06/05/122230.html</guid><wfw:comment>http://www.blogjava.net/java-tju/comments/122230.html</wfw:comment><comments>http://www.blogjava.net/java-tju/archive/2007/06/05/122230.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/java-tju/comments/commentRss/122230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-tju/services/trackbacks/122230.html</trackback:ping><description><![CDATA[<p><br>二、JDOM 包概览<br>JDOM是由以下几个包组成的<br>org.JDOM<br>org.JDOM.input<br>org.JDOM.output<br>org.JDOM.adapters<br>org.JDOM.transform</p>
<p>三、JDOM 类说明</p>
<p>org.JDOM<br>这个包里的类是你解析xml文件后所要用到的所有数据类型。<br>Attribute<br>CDATA<br>Coment<br>DocType<br>Document<br>Element<br>EntityRef<br>Namespace<br>ProscessingInstruction<br>Text</p>
<p>org.JDOM.transform<br>在涉及xslt格式转换时应使用下面的2个类<br>JDOMSource<br>JDOMResult</p>
<p>org.JDOM.input<br>输入类，一般用于文档的创建工作<br>SAXBuilder<br>DOMBuilder<br>ResultSetBuilder</p>
<p>org.JDOM.output<br>输出类，用于文档转换输出<br>XMLOutputter<br>SAXOutputter<br>DomOutputter<br>JTreeOutputter</p>
<p>使用前注意事项：<br>1.JDOM对于JAXP 以及 TRax 的支持<br>JDOM 支持JAXP1.1：你可以在程序中使用任何的parser工具类,默认情况下是JAXP的parser。<br>制定特别的parser可用如下形式<br>SAXBuilder parser <br>&nbsp; = new SAXBuilder("org.apache.crimson.parser.XMLReaderImpl");<br>&nbsp;Document doc = parser.build("<a href="http://www.cafeconleche.org/">http://www.cafeconleche.org/</a>");<br>&nbsp;// work with the document...<br>JDOM也支持TRaX：XSLT可通过JDOMSource以及JDOMResult类来转换（参见以后章节）<br>2.注意在JDOM里文档（Document）类由org.JDOM.Document 来表示。这要与org.w3c.dom中的Document区别开，这2种格式如何转换在后面会说明。<br>以下如无特指均指JDOM里的Document。</p>
<p><br>四、JDOM主要使用方法<br>1.Ducument类<br>(1)Document的操作方法：<br>Element root = new Element("GREETING");<br>Document doc = new Document(root);<br>root.setText("Hello JDOM!");<br>或者简单的使用Document doc = new Document(new Element("GREETING").setText("Hello JDOM!t"));</p>
<p>这点和DOM不同。Dom则需要更为复杂的代码，如下：<br>DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();<br>DocumentBuilder builder =factory.newDocumentBuilder();<br>Document doc = builder.newDocument();<br>Element root =doc.createElement("root");<br>Text text = doc.createText("This is the root");<br>root.appendChild(text);<br>doc.appendChild(root);</p>
<p><br>注意事项：JDOM不允许同一个节点同时被2个或多个文档相关联，要在第2个文档中使用原来老文档中的节点的话。首先需要使用detach()把这个节点分开来。</p>
<p>(2)从文件、流、系统ID、URL得到Document对象：<br>DOMBuilder builder = new DOMBuilder();<br>Document doc = builder.build(new File("jdom_test.xml"));</p>
<p>SAXBuilder builder = new SAXBuilder();<br>Document doc = builder.build(url);<br>在新版本中DOMBuilder 已经Deprecated掉 DOMBuilder.builder(url)，用SAX效率会比较快。</p>
<p>这里举一个小例子，为了简单起见，使用String对象直接作为xml数据源：</p>
<p>&nbsp;public jdomTest() {<br>&nbsp;&nbsp;&nbsp; String textXml = null;<br>&nbsp;&nbsp;&nbsp; textXml = "&lt;note&gt;";<br>&nbsp;&nbsp;&nbsp; textXml = textXml +<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "&lt;to&gt;aaa&lt;/to&gt;&lt;from&gt;bbb&lt;/from&gt;&lt;heading&gt;ccc&lt;/heading&gt;&lt;body&gt;ddd&lt;/body&gt;";<br>&nbsp;&nbsp;&nbsp; textXml = textXml + "&lt;/note&gt;";<br>&nbsp;&nbsp;&nbsp; SAXBuilder builder = new SAXBuilder();<br>&nbsp;&nbsp;&nbsp; Document doc = null;<br>&nbsp;&nbsp;&nbsp; Reader in= new StringReader(textXml);<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc = builder.build(in);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element root = doc.getRootElement();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List ls = root.getChildren();//注意此处取出的是root节点下面的一层的Element集合<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator iter = ls.iterator(); iter.hasNext(); ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element el = (Element) iter.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(el.getName().equals("to")){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(el.getText());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (IOException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (JDOMException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>很简单把。</p>
<p><br>(3)DOM的document和JDOM的Document之间的相互转换使用方法，简单！<br>DOMBuilder builder = new DOMBuilder();<br>org.jdom.Document jdomDocument = builder.build(domDocument);<br>// work with the JDOM document&#8230;</p>
<p>DOMOutputter converter = new DOMOutputter();<br>org.w3c.dom.Document domDocument = converter.output(jdomDocument);<br>// work with the DOM document&#8230;</p>
<p>2.XML文档输出<br>XMLOutPutter类：<br>JDOM的输出非常灵活,支持很多种io格式以及风格的输出<br>Document doc = new Document(...);<br>XMLOutputter outp = new XMLOutputter();<br>// Raw output<br>outp.output(doc, fileOutputStream);<br>// Compressed output<br>outp.setTextTrim(true);<br>outp.output(doc, socket.getOutputStream());<br>// Pretty output<br>outp.setIndent(" ");<br>outp.setNewlines(true);<br>outp.output(doc, System.out);<br>......<br>详细请参阅最新的JDOM API手册</p>
<p><br>3.Element 类：<br>(1)浏览Element树<br>//获得根元素element<br>Element root = doc.getRootElement();<br>// 获得所有子元素的一个list<br>List allChildren = root.getChildren();<br>// 获得指定名称子元素的list<br>List namedChildren = root.getChildren("name");<br>//获得指定名称的第一个子元素<br>Element child = root.getChild("name");<br>（这里的List是java.util.List）</p>
<p>JDOM给了我们很多很灵活的使用方法来管理子元素<br>List allChildren = root.getChildren();<br>// 删除第四个子元素<br>allChildren.remove(3);<br>// 删除叫&#8220;jack&#8221;的子元素<br>allChildren.removeAll(root.getChildren("jack"));</p>
<p>root.removeChildren("jack"); // 便捷写法<br>// 加入<br>allChildren.add(new Element("jane"));</p>
<p>root.addContent(new Element("jane")); // 便捷写法<br>allChildren.add(0, new Element("first"));</p>
<p><br>(2)移动Elements:<br>在JDOM里很简单<br>Element movable = new Element("movable");<br>parent1.addContent(movable); // place<br>parent1.removeContent(movable); // remove<br>parent2.addContent(movable); // add</p>
<p>在Dom里<br>Element movable = doc1.createElement("movable");<br>parent1.appendChild(movable); // place<br>parent1.removeChild(movable); // remove<br>parent2.appendChild(movable); // 出错!</p>
<p>补充：<br>纠错性<br>JDOM的Element构造函数（以及它的其他函数）会检查element是否合法。<br>而它的add/remove方法会检查树结构，检查内容如下：<br>1.在任何树中是否有回环节点<br>2.是否只有一个根节点<br>3.是否有一致的命名空间（Namespaces）</p>
<p>&nbsp;</p>
<p>(3)Element的text内容读取<br>&lt;description&gt;<br>A cool demo<br>&lt;/description&gt;</p>
<p>// The text is directly available<br>// Returns "\n A cool demo\n"<br>String desc = element.getText();</p>
<p>// There's a convenient shortcut<br>// Returns "A cool demo"<br>String desc = element.getTextTrim();</p>
<p>(4)Elment内容修改<br>element.setText("A new description");<br>3.可正确解释特殊字符<br>element.setText("&lt;xml&gt; content");<br>4.CDATA的数据写入、读出<br>element.addContent(new CDATA("&lt;xml&gt; content"));<br>String noDifference = element.getText();</p>
<p>混合内容<br>element可能包含很多种内容，比如说</p>
<p>&lt;table&gt;<br>&lt;!-- Some comment --&gt;<br>Some text<br>&lt;tr&gt;Some child element&lt;/tr&gt;<br>&lt;/table&gt;</p>
<p>取table的子元素tr<br>String text = table.getTextTrim();<br>Element tr = table.getChild("tr");</p>
<p>也可使用另外一个比较简单的方法<br>List mixedCo = table.getContent();<br>Iterator itr = mixedCo.iterator();<br>while (itr.hasNext()) {<br>Object o = i.next();<br>if (o instanceof Comment) {<br>...<br>}<br>// 这里可以写成Comment, Element, Text, CDATA,ProcessingInstruction, 或者是EntityRef的类型<br>}<br>// 现在移除Comment,注意这里游标应为1。这是由于回车键也被解析成Text类的缘故,所以Comment项应为1。<br>mixedCo.remove(1);</p>
<p>&nbsp;</p>
<p>4.Attribute类<br>&lt;table width="100%" border="0"&gt; &lt;/table&gt;<br>//获得attribute<br>String width = table.getAttributeValue("width");<br>int border = table.getAttribute("width").getIntValue();<br>//设置attribute<br>table.setAttribute("vspace", "0");<br>// 删除一个或全部attribute<br>table.removeAttribute("vspace");<br>table.getAttributes().clear();</p>
<p>&nbsp;</p>
<p>5.处理指令(Processing Instructions)操作<br>一个Pls的例子<br>&lt;?br?&gt;<br>&lt;?cocoon-process type="xslt"?&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目标&nbsp;&nbsp;&nbsp;&nbsp; 数据</p>
<p>处理目标名称(Target)<br>String target = pi.getTarget();<br>获得所有数据（data），在目标（target）以后的所有数据都会被返回。<br>String data = pi.getData();<br>获得指定属性的数据<br>String type = pi.getValue("type");<br>获得所有属性的名称<br>List ls = pi.getNames();</p>
<p>6.命名空间操作<br>&lt;xhtml:html <br>&nbsp;xmlns:xhtml="<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>"&gt;<br>&lt;xhtml:title&gt;Home Page&lt;/xhtml:title&gt;<br>&lt;/xhtml:html&gt;</p>
<p>Namespace xhtml = Namespace.getNamespace("xhtml", "<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>");<br>List kids = html.getChildren("title", xhtml);<br>Element kid = html.getChild("title", xhtml);<br>kid.addContent(new Element("table", xhtml));</p>
<p>7.XSLT格式转换<br>使用以下函数可对XSLT转换<br>最后如果你需要使用w3c的Document则需要转换一下。<br>public static Document transform(String stylesheet，Document in)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws JDOMException {<br>&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transformer transformer = TransformerFactory.newInstance()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .newTransformer(new StreamSource(stylesheet));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDOMResult out = new JDOMResult();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transformer.transform(new JDOMSource(in), out);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return out.getDeocument();<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; catch (TransformerException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new JDOMException("XSLT Trandformation failed", e);<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/java-tju/aggbug/122230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-tju/" target="_blank">java_tju</a> 2007-06-05 20:03 <a href="http://www.blogjava.net/java-tju/archive/2007/06/05/122230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>