﻿<?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-似水流年-文章分类-XML</title><link>http://www.blogjava.net/huhu/category/1842.html</link><description>Huhu'Blog</description><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 21:10:18 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 21:10:18 GMT</pubDate><ttl>60</ttl><item><title>JDOM使用详解及实例</title><link>http://www.blogjava.net/huhu/articles/11866.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Sat, 03 Sep 2005 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/11866.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/11866.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/11866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/11866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/11866.html</trackback:ping><description><![CDATA[<P>一、JDOM 简介</P>
<P>JDOM是一个开源项目，它基于树型结构，利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。</P>
<P>JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性（方法重载、集合概念以及映射），把SAX和DOM的功能有效地结合起来。</P>
<P>在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。</P>
<P>JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter开发出来，以弥补DOM及SAX在实际应用当中的不足之处。</P>
<P>这些不足之处主要在于SAX没有文档修改、随机访问以及输出的功能，而对于DOM来说，JAVA程序员在使用时来用起来总觉得不太方便。</P>
<P>DOM的缺点主要是来自于由于Dom是一个接口定义语言（IDL）,它的任务是在不同语言实现中的一个最低的通用标准，并不是为JAVA特别设计的。JDOM的最新版本为JDOM Beta 9。最近JDOM被收录到JSR-102内，这标志着JDOM成为了JAVA平台组成的一部分。</P>
<P>二、JDOM 包概览</P>
<P>JDOM是由以下几个包组成的<BR>org.jdom&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含了所有的xml文档要素的java类<BR><BR>org.jdom.adapters&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含了与dom适配的java类</P>
<P>org.jdom.filter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含了xml文档的过滤器类</P>
<P>org.jdom.input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含了读取xml文档的类</P>
<P>org.jdom.output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含了写入xml文档的类</P>
<P>org.jdom.transform&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含了将jdom xml文档接口转换为其他xml文档接口</P>
<P>org.jdom.xpath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包含了对xml文档xpath操作的类三、JDOM 类说明</P>
<P>1、org.JDOM这个包里的类是你J解析xml文件后所要用到的所有数据类型。</P>
<P>Attribute</P>
<P>CDATA</P>
<P>Coment</P>
<P>DocType</P>
<P>Document</P>
<P>Element</P>
<P>EntityRef</P>
<P>Namespace</P>
<P>ProscessingInstruction</P>
<P>Text</P>
<P>2、org.JDOM.transform在涉及xslt格式转换时应使用下面的2个类</P>
<P>JDOMSource</P>
<P>JDOMResult</P>
<P>org.JDOM.input</P>
<P>3、输入类，一般用于文档的创建工作</P>
<P>SAXBuilder</P>
<P>DOMBuilder</P>
<P>ResultSetBuilder</P>
<P>org.JDOM.output</P>
<P>4、输出类，用于文档转换输出</P>
<P>XMLOutputter</P>
<P>SAXOutputter</P>
<P>DomOutputter</P>
<P>JTreeOutputter</P>
<P>使用前注意事项：</P>
<P>1.JDOM对于JAXP 以及 TRax 的支持</P>
<P>JDOM 支持JAXP1.1：你可以在程序中使用任何的parser工具类,默认情况下是JAXP的parser。</P>
<P>制定特别的parser可用如下形式</P>
<P>SAXBuilder parser </P>
<P>&nbsp; = new SAXBuilder("org.apache.crimson.parser.XMLReaderImpl");</P>
<P>&nbsp;Document doc = parser.build("<A href="http://www.cafeconleche.org/">http://www.cafeconleche.org/</A>");</P>
<P>&nbsp;// work with the document...</P>
<P>JDOM也支持TRaX：XSLT可通过JDOMSource以及JDOMResult类来转换（参见以后章节）</P>
<P>2.注意在JDOM里文档（Document）类由org.JDOM.Document 来表示。这要与org.w3c.dom中的Document区别开，这2种格式如何转换在后面会说明。</P>
<P>以下如无特指均指JDOM里的Document。</P>
<P>四、JDOM主要使用方法</P>
<P>1.Ducument类</P>
<P>(1)Document的操作方法：</P>
<P>Element root = new Element("GREETING");</P>
<P>Document doc = new Document(root);</P>
<P>root.setText("Hello JDOM!");</P>
<P>或者简单的使用Document doc = new Document(new Element("GREETING").setText("Hello JDOM!t"));</P>
<P>这点和DOM不同。Dom则需要更为复杂的代码，如下：</P>
<P>DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();</P>
<P>DocumentBuilder builder =factory.newDocumentBuilder();</P>
<P>Document doc = builder.newDocument();</P>
<P>Element root =doc.createElement("root");</P>
<P>Text text = doc.createText("This is the root");</P>
<P>root.appendChild(text);</P>
<P>doc.appendChild(root);</P>
<P>注意事项：JDOM不允许同一个节点同时被2个或多个文档相关联，要在第2个文档中使用原来老文档中的节点的话。首先需要使用detach()把这个节点分开来。</P>
<P>(2)从文件、流、系统ID、URL得到Document对象：</P>
<P>DOMBuilder builder = new DOMBuilder();</P>
<P>Document doc = builder.build(new File("jdom_test.xml"));</P>
<P>SAXBuilder builder = new SAXBuilder();</P>
<P>Document doc = builder.build(url);</P>
<P>在新版本中DOMBuilder 已经Deprecated掉 DOMBuilder.builder(url)，用SAX效率会比较快。</P>
<P>这里举一个小例子，为了简单起见，使用String对象直接作为xml数据源：</P>
<P>&nbsp;public jdomTest() {</P>
<P>&nbsp;&nbsp;&nbsp; String textXml = null;</P>
<P>&nbsp;&nbsp;&nbsp; textXml = "&lt;note&gt;";</P>
<P>&nbsp;&nbsp;&nbsp; textXml = textXml +</P>
<P>&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;";</P>
<P>&nbsp;&nbsp;&nbsp; textXml = textXml + "&lt;/note&gt;";</P>
<P>&nbsp;&nbsp;&nbsp; SAXBuilder builder = new SAXBuilder();</P>
<P>&nbsp;&nbsp;&nbsp; Document doc = null;</P>
<P>&nbsp;&nbsp;&nbsp; Reader in= new StringReader(textXml);</P>
<P>&nbsp;&nbsp;&nbsp; try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc = builder.build(in);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element root = doc.getRootElement();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List ls = root.getChildren();//注意此处取出的是root节点下面的一层的Element集合</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator iter = ls.iterator(); iter.hasNext(); ) {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element el = (Element) iter.next();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(el.getName().equals("to")){</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(el.getText());</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; catch (IOException ex) {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();</P>
<P>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; catch (JDOMException ex) {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();</P>
<P>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp; }</P>
<P>(3)DOM的document和JDOM的Document之间的相互转换使用方法，简单！</P>
<P>DOMBuilder builder = new DOMBuilder();</P>
<P>org.jdom.Document jdomDocument = builder.build(domDocument);</P>
<P>DOMOutputter converter = new DOMOutputter();// work with the JDOM document…</P>
<P>org.w3c.dom.Document domDocument = converter.output(jdomDocument);</P>
<P>// work with the DOM document…</P>
<P>2.XML文档输出</P>
<P>XMLOutPutter类：</P>
<P>JDOM的输出非常灵活,支持很多种io格式以及风格的输出</P>
<P>Document doc = new Document(...);</P>
<P>XMLOutputter outp = new XMLOutputter();</P>
<P>outp.output(doc, fileOutputStream); // Raw output</P>
<P>outp.setTextTrim(true); // Compressed output</P>
<P>outp.output(doc, socket.getOutputStream());</P>
<P>outp.setIndent(" ");// Pretty output</P>
<P>outp.setNewlines(true);</P>
<P>outp.output(doc, System.out);</P>
<P>详细请参阅最新的JDOM API手册</P>
<P>3.Element 类：</P>
<P>(1)浏览Element树</P>
<P>Element root = doc.getRootElement();//获得根元素element</P>
<P>List allChildren = root.getChildren();// 获得所有子元素的一个list</P>
<P>List namedChildren = root.getChildren("name");// 获得指定名称子元素的list</P>
<P>Element child = root.getChild("name");//获得指定名称的第一个子元素</P>
<P>JDOM给了我们很多很灵活的使用方法来管理子元素（这里的List是java.util.List）</P>
<P>List allChildren = root.getChildren();</P>
<P>allChildren.remove(3); // 删除第四个子元素</P>
<P>allChildren.removeAll(root.getChildren("jack"));// 删除叫“jack”的子元素</P>
<P>root.removeChildren("jack"); // 便捷写法</P>
<P>allChildren.add(new Element("jane"));// 加入</P>
<P>root.addContent(new Element("jane")); // 便捷写法</P>
<P>allChildren.add(0, new Element("first"));</P>
<P>(2)移动Elements:</P>
<P>在JDOM里很简单</P>
<P>Element movable = new Element("movable");</P>
<P>parent1.addContent(movable); // place</P>
<P>parent1.removeContent(movable); // remove</P>
<P>parent2.addContent(movable); // add</P>
<P>在Dom里</P>
<P>Element movable = doc1.createElement("movable");</P>
<P>parent1.appendChild(movable); // place</P>
<P>parent1.removeChild(movable); // remove</P>
<P>parent2.appendChild(movable); // 出错!</P>
<P>补充：纠错性</P>
<P>JDOM的Element构造函数（以及它的其他函数）会检查element是否合法。</P>
<P>而它的add/remove方法会检查树结构，检查内容如下：</P>
<P>1.在任何树中是否有回环节点</P>
<P>2.是否只有一个根节点</P>
<P>3.是否有一致的命名空间（Namespaces） </P>
<P>(3)Element的text内容读取</P>
<P>&lt;description&gt;</P>
<P>A cool demo</P>
<P>&lt;/description&gt;</P>
<P>// The text is directly available</P>
<P>// Returns "\n A cool demo\n"</P>
<P>String desc = element.getText();</P>
<P>// There's a convenient shortcut</P>
<P>// Returns "A cool demo"</P>
<P>String desc = element.getTextTrim();</P>
<P>(4)Elment内容修改</P>
<P>element.setText("A new description");</P>
<P>3.可正确解释特殊字符</P>
<P>element.setText("&lt;xml&gt; content");</P>
<P>4.CDATA的数据写入、读出</P>
<P>element.addContent(new CDATA("&lt;xml&gt; content"));</P>
<P>String noDifference = element.getText();</P>
<P>混合内容</P>
<P>element可能包含很多种内容，比如说</P>
<P>&lt;table&gt;</P>
<P>&lt;!-- Some comment --&gt;</P>
<P>Some text</P>
<P>&lt;tr&gt;Some child element&lt;/tr&gt;</P>
<P>&lt;/table&gt;</P>
<P>取table的子元素tr</P>
<P>String text = table.getTextTrim();</P>
<P>Element tr = table.getChild("tr");</P>
<P>也可使用另外一个比较简单的方法</P>
<P>List mixedCo = table.getContent();</P>
<P>Iterator itr = mixedCo.iterator();</P>
<P>while (itr.hasNext()) {</P>
<P>Object o = i.next();</P>
<P>if (o instanceof Comment) {...}</P>
<P>// 这里可以写成Comment, Element, Text, CDATA,ProcessingInstruction, 或者是EntityRef的类型</P>
<P>}</P>
<P>// 现在移除Comment,注意这里游标应为1。这是由于回车键也被解析成Text类的缘故,所以Comment项应为1。</P>
<P>mixedCo.remove(1); </P>
<P>4.Attribute类</P>
<P>&lt;table width="100%" border="0"&gt; &lt;/table&gt;</P>
<P>String width = table.getAttributeValue("width");//获得attribute</P>
<P>int border = table.getAttribute("width").getIntValue();</P>
<P>table.setAttribute("vspace", "0");//设置attribute</P>
<P>table.removeAttribute("vspace");// 删除一个或全部attribute</P>
<P>table.getAttributes().clear(); </P>
<P>5.处理指令(Processing Instructions)操作</P>
<P>一个Pls的例子</P>
<P>&lt;?br?&gt;</P>
<P>&lt;?cocoon-process type="xslt"?&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目标&nbsp;&nbsp;&nbsp;&nbsp; 数据</P>
<P>处理目标名称(Target)</P>
<P>String target = pi.getTarget();</P>
<P>获得所有数据（data），在目标（target）以后的所有数据都会被返回。</P>
<P>String data = pi.getData();</P>
<P>String type = pi.getValue("type");获得指定属性的数据</P>
<P>List ls = pi.getNames();获得所有属性的名称</P>
<P>6.命名空间操作</P>
<P>&lt;xhtml:html </P>
<P>&nbsp;xmlns:xhtml="<A href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</A>"&gt;</P>
<P>&lt;xhtml:title&gt;Home Page&lt;/xhtml:title&gt;</P>
<P>&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>");</P>
<P>List kids = html.getChildren("title", xhtml);</P>
<P>Element kid = html.getChild("title", xhtml);</P>
<P>kid.addContent(new Element("table", xhtml));</P>
<P>7.XSLT格式转换</P>
<P>使用以下函数可对XSLT转换</P>
<P>最后如果你需要使用w3c的Document则需要转换一下。</P>
<P>public static Document transform(String stylesheet，Document in)</P>
<P>&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 {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; try {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transformer transformer = TransformerFactory.newInstance()</P>
<P>&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));</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDOMResult out = new JDOMResult();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transformer.transform(new JDOMSource(in), out);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return out.getDeocument();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; catch (TransformerException e) {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new JDOMException("XSLT Trandformation failed", e);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; }</P>
<P>五、用例:</P>
<P>1、生成xml文档：</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>public class WriteXML{</P>
<P>&nbsp;&nbsp;&nbsp; public void BuildXML() throws Exception {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element root,student,number,name,age;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = new Element("student-info"); //生成根元素：student-info</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; student = new Element("student"); //生成元素：student(number,name,age)&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; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number = new Element("number");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = new Element("name");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; age = new Element("age");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document doc = new Document(root); //将根元素植入文档doc中</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number.setText("001");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name.setText("lnman");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; age.setText("24");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; student.addContent(number);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; student.addContent(name);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; student.addContent(age);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root.addContent(student);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Format format = Format.getCompactFormat();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format.setEncoding("gb2312"); //设置xml文件的字符为gb2312</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format.setIndent("&nbsp;&nbsp;&nbsp; "); //设置xml文件的缩进为4个空格</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLOutputter XMLOut = new XMLOutputter(format);//元素后换行一层元素缩四格 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLOut.output(doc, new FileOutputStream("studentinfo.xml"));&nbsp; </P>
<P>}</P>
<P>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteXML w = new WriteXML();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Now we build an XML document .....");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w.BuildXML();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("finished!");</P>
<P>}</P>
<P>}</P>
<P>生成的xml文档为：</P>
<P>&lt;?xml version="1.0" encoding="gb2312"?&gt;</P>
<P>&lt;student-info&gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;student&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;number&gt;001&lt;/number&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;lnman&lt;/name&gt;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;age&gt;24&lt;/age&gt;</P>
<P>&nbsp;&nbsp;&nbsp; &lt;/student&gt;</P>
<P>&lt;/student-info&gt;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>创建XML文档2：</P>
<P>&nbsp;public class CreateXML {</P>
<P>&nbsp; public void Create() {</P>
<P>&nbsp;&nbsp; try {</P>
<P>&nbsp;&nbsp;&nbsp; Document doc = new Document();&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp; ProcessingInstruction pi=new ProcessingInstruction("xml-stylesheet","type="text/xsl" href="test.xsl"");</P>
<P>&nbsp;&nbsp;&nbsp; doc.addContent(pi);&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp; Namespace ns = Namespace.getNamespace("<A href="http://www.bromon.org/">http://www.bromon.org</A>" );</P>
<P>&nbsp;&nbsp;&nbsp; Namespace ns2 = Namespace.getNamespace("other", "<A href="http://www.w3c.org/">http://www.w3c.org</A>" );</P>
<P>&nbsp;&nbsp;&nbsp; Element root = new Element("根元素", ns);</P>
<P>&nbsp;&nbsp;&nbsp; root.addNamespaceDeclaration(ns2);</P>
<P>&nbsp;&nbsp;&nbsp; doc.setRootElement(root);</P>
<P>&nbsp;&nbsp;&nbsp; Element el1 = new Element("元素一");</P>
<P>&nbsp;&nbsp;&nbsp; el1.setAttribute("属性", "属性一");&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp; Text text1=new Text("元素值");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element em = new Element("元素二").addContent("第二个元素");</P>
<P>&nbsp;&nbsp;&nbsp; el1.addContent(text1);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; el1.addContent(em);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element el2 = new Element("元素三").addContent("第三个元素");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root.addContent(el1);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root.addContent(el2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //缩进四个空格,自动换行,gb2312编码</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLOutputter outputter = new XMLOutputter("&nbsp; ", true,"GB2312");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputter.output(doc, new FileWriter("test.xml"));</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e)&nbsp; {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new CreateXML().Create();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;}</P>
<P>2、读取xml文档的例子：</P>
<P>import org.jdom.output.*;</P>
<P>import org.jdom.input.*;</P>
<P>import org.jdom.*;</P>
<P>import java.io.*;</P>
<P>import java.util.*;</P>
<P>public class ReadXML{</P>
<P>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXBuilder builder = new SAXBuilder();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document read_doc = builder.build("studentinfo.xml");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element stu = read_doc.getRootElement();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = stu.getChildren("student");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 0;i &lt; list.size();i++) {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element e = (Element)list.get(i);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str_number = e.getChildText("number");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str_name = e.getChildText("name");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str_age = e.getChildText("age");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("---------STUDENT--------------");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("NUMBER:" + str_number);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("NAME:" + str_name);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("AGE:" + str_age);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("------------------------------");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>}</P>
<P>3、DTD验证的：</P>
<P>&nbsp;public class XMLWithDTD {</P>
<P>&nbsp; public void validate()&nbsp; {</P>
<P>&nbsp;&nbsp; try {</P>
<P>&nbsp;&nbsp;&nbsp; SAXBuilder builder = new SAXBuilder(true);</P>
<P>&nbsp;&nbsp;&nbsp; builder.setFeature("<A href='http://xml.org/sax/features/validation";,true'>http://xml.org/sax/features/validation";,true</A>); </P>
<P>&nbsp;&nbsp;&nbsp; Document doc = builder.build(new FileReader("author.xml"));&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp; System.out.println("搞掂");</P>
<P>&nbsp;&nbsp;&nbsp; XMLOutputter outputter = new XMLOutputter();</P>
<P>&nbsp;&nbsp;&nbsp; outputter.output(doc, System.out);</P>
<P>&nbsp;&nbsp; }catch(Exception e) {</P>
<P>&nbsp;&nbsp;&nbsp; System.out.println(e);</P>
<P>&nbsp;&nbsp; }&nbsp;&nbsp; </P>
<P>&nbsp; }</P>
<P>&nbsp; public static void main(String args[]) {</P>
<P>&nbsp;&nbsp; new XMLWithDTD().validate();</P>
<P>&nbsp; }&nbsp; </P>
<P>&nbsp;}</P>
<P>&nbsp;　　需要说明的是，这个程序没有指明使用哪个DTD文件。DTD文件的位置是在XML中指定的，而且DTD不支持命名空间，一个XML只能引用一个DTD，所以程序直接读取XML中指定的DTD，程序本身不用指定。不过这样一来，好象就只能使用外部式的DTD引用方式了？高人指点。</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>4、XML Schema验证的：</P>
<P>&nbsp;public class XMLWithSchema {</P>
<P>&nbsp; String xml="test.xml";</P>
<P>&nbsp; String schema="test-schema.xml";</P>
<P>&nbsp; public void validate() {</P>
<P>&nbsp;&nbsp; try {</P>
<P>&nbsp;&nbsp;&nbsp; SAXBuilder builder = new SAXBuilder(true);</P>
<P>&nbsp;&nbsp;&nbsp; //指定约束方式为XML schema</P>
<P>&nbsp;&nbsp;&nbsp; builder.setFeature("<A href="http://apache.org/xml/features/validation/schema">http://apache.org/xml/features/validation/schema</A>";,&nbsp; true);</P>
<P>&nbsp;&nbsp;&nbsp; //导入schema文件</P>
<P>builder.setProperty("<A href='http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation";,schema'>http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation";,schema</A>); </P>
<P>&nbsp;&nbsp;&nbsp; Document doc = builder.build(new FileReader(xml));&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp; System.out.println("搞掂");</P>
<P>&nbsp;&nbsp;&nbsp; XMLOutputter outputter = new XMLOutputter();</P>
<P>&nbsp;&nbsp;&nbsp; outputter.output(doc, System.out);</P>
<P>&nbsp;&nbsp; }catch(Exception e) {</P>
<P>&nbsp;&nbsp;&nbsp; System.out.println("验证失败:"+e);</P>
<P>&nbsp;&nbsp; }&nbsp; </P>
<P>&nbsp; } </P>
<P>&nbsp;}</P>
<P>&nbsp;上面的程序就指出了要引入的XML Schema文件的位置。</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;系统默认输出是UTF-8，这有可能导致出现乱码。</P>
<P>5、Xpath例子：</P>
<P>JDOM的关于XPATH的api在org.jdom.xpath这个包里。这个包下，有一个抽象类XPath.java和实现类JaxenXPath.java， 使用时先用XPath类的静态方法newInstance(String xpath)得到XPath对象，然后调用它的selectNodes(Object context)方法或selectSingleNode(Object context)方法，前者根据xpath语句返回一组节点(List对象)；后者根据一个xpath语句返回符合条件的第一个节点(Object类型)。请看jdom-1.0自带的范例程序： </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; 它分析在web.xml文件中的注册的servlet的个数及参数个数，并输出角色名。 </P>
<P>web.xml文件： </P>
<P>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; </P>
<P>&lt;!-- </P>
<P>&lt;!DOCTYPE web-app </P>
<P>&nbsp;&nbsp;&nbsp; PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" </P>
<P>&nbsp;&nbsp;&nbsp; "<A href="http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">http://java.sun.com/j2ee/dtds/web-app_2.2.dtd</A>"&gt; </P>
<P>--&gt; </P>
<P>&lt;web-app&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;servlet&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;snoop&lt;/servlet-name&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;SnoopServlet&lt;/servlet-class&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;/servlet&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;servlet&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;file &lt;/servlet-name&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;ViewFile&lt;/servlet-class&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;initial&lt;/param-name&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;1000&lt;/param-value&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;The initial value for the counter&nbsp; &lt;!-- optional --&gt;&lt;/description&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;/servlet&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;mv&lt;/servlet-name&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.wm&lt;/url-pattern&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;distributed/&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;security-role&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role-name&gt;manager&lt;/role-name&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role-name&gt;director&lt;/role-name&gt; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role-name&gt;president&lt;/role-name&gt; </P>
<P>&nbsp;&nbsp;&nbsp; &lt;/security-role&gt; </P>
<P>&lt;/web-app&gt; </P>
<P>处理程序： </P>
<P>import java.io.*; </P>
<P>import java.util.*;&nbsp; </P>
<P>public class XPathReader {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException, JDOMException { </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (args.length != 1) { </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Usage: java XPathReader web.xml"); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filename = args[0];//从命令行输入web.xml </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintStream out = System.out; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXBuilder builder = new SAXBuilder(); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document doc = builder.build(new File(filename));//得到Document对象 </P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Print servlet information </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XPath servletPath = XPath.newInstance("//servlet");//,选择任意路径下servlet元素 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List servlets = servletPath.selectNodes(doc);//返回所有的servlet元素。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("This WAR has "+ servlets.size() +" registered servlets:"); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator i = servlets.iterator(); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (i.hasNext()) {//输出servlet信息 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element servlet = (Element) i.next(); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.print("\t" + servlet.getChild("servlet-name") </P>
<P>&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; .getTextTrim() + </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " for " + servlet.getChild("servlet-class") </P>
<P>&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; .getTextTrim()); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List initParams = servlet.getChildren("init-param"); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(" (it has " + initParams.size() + " init params)");&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Print security role information </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XPath rolePath = XPath.newInstance("//security-role/role-name/text()"); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List roleNames = rolePath.selectNodes(doc);//得到所有的角色名 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (roleNames.size() == 0) { </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("This WAR contains no roles"); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("This WAR contains " + roleNames.size() + " roles:"); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = roleNames.iterator(); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (i.hasNext()) {//输出角色名 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("\t" + ((Text)i.next()).getTextTrim()); </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </P>
<P>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>} </P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>输出结果: </P>
<P>C:\java&gt;java&nbsp;&nbsp; XPathReader web.xml </P>
<P>This WAR has 2 registered servlets: </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; snoop for SnoopServlet (it has 0 init params) </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file for ViewFile (it has 1 init params) </P>
<P>This WAR contains 3 roles: </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; manager </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; director </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; president</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>6、数据输入要用到XML文档要通过org.jdom.input包，反过来需要org.jdom.output。如前面所说，关是看API文档就能够使用。 </P>
<P>我们的例子读入XML文件exampleA.xml，加入一条处理指令，修改第一本书的价格和作者，并添加一条属性，然后写入文件exampleB.xml： </P>
<P>//exampleA.xml </P>
<P>&lt;?xml version="1.0" encoding="GBK"?&gt; </P>
<P>&lt;bookList&gt; </P>
<P>&lt;book&gt; </P>
<P>&lt;name&gt;Java编程入门&lt;/name&gt; </P>
<P>&lt;author&gt;张三&lt;/author&gt; </P>
<P>&lt;publishDate&gt;2002-6-6&lt;/publishDate&gt; </P>
<P>&lt;price&gt;35.0&lt;/price&gt; </P>
<P>&lt;/book&gt; </P>
<P>&lt;book&gt; </P>
<P>&lt;name&gt;XML在Java中的应用&lt;/name&gt; </P>
<P>&lt;author&gt;李四&lt;/author&gt; </P>
<P>&lt;publishDate&gt;2002-9-16&lt;/publishDate&gt; </P>
<P>&lt;price&gt;92.0&lt;/price&gt; </P>
<P>&lt;/book&gt; </P>
<P>&lt;/bookList&gt; </P>
<P>//testJDOM.java </P>
<P>import org.jdom.*; </P>
<P>import org.jdom.output.*; </P>
<P>import org.jdom.input.*; </P>
<P>import java.io.*; </P>
<P>public class TestJDOM{ </P>
<P>public static void main(String args[])throws Exception{ </P>
<P>SAXBuilder sb = new SAXBuilder(); </P>
<P>//从文件构造一个Document，因为XML文件中已经指定了编码，所以这里不必了 </P>
<P>Document doc = sb.build(new FileInputStream("exampleA.xml")); </P>
<P>ProcessingInstruction pi = new ProcessingInstruction//加入一条处理指令 </P>
<P>("xml-stylesheet","href=\"bookList.html.xsl\" type=\"text/xsl\""); </P>
<P>doc.addContent(pi); </P>
<P>Element root = doc.getRootElement(); //得到根元素 </P>
<P>java.util.List books = root.getChildren(); //得到根元素所有子元素的集合 </P>
<P>Element book = (Element)books.get(0); //得到第一个book元素 </P>
<P>//为第一本书添加一条属性 </P>
<P>Attribute a = new Attribute("hot","true"); </P>
<P>book.setAttribute(a); </P>
<P>Element author = book.getChild("author"); //得到指定的字元素 </P>
<P>author.setText("王五"); //将作者改为王五 </P>
<P>//或 Text t = new Text("王五");book.addContent(t); </P>
<P>Element price = book.getChild("price"); //得到指定的字元素 </P>
<P>//修改价格，比较郁闷的是我们必须自己转换数据类型，而这正是JAXB的优势 </P>
<P>author.setText(Float.toString(50.0f)); </P>
<P>String indent = " "; </P>
<P>boolean newLines = true; </P>
<P>XMLOutputter outp = new XMLOutputter(indent,newLines,"GBK"); </P>
<P>outp.output(doc, new FileOutputStream("exampleB.xml")); </P>
<P>} </P>
<P>}; </P>
<P>执行结果exampleB.xml： </P>
<P>&lt;?xml version="1.0" encoding="GBK"?&gt; </P>
<P>&lt;bookList&gt; </P>
<P>&lt;book hot=”true”&gt; </P>
<P>&lt;name&gt;Java编程入门&lt;/name&gt; </P>
<P>&lt;author&gt;50.0&lt;/author&gt; </P>
<P>&lt;publishDate&gt;2002-6-6&lt;/publishDate&gt; </P>
<P>&lt;price&gt;35.0&lt;/price&gt; </P>
<P>&lt;/book&gt; </P>
<P>&lt;book&gt; </P>
<P>&lt;name&gt;XML在Java中的应用&lt;/name&gt; </P>
<P>&lt;author&gt;李四&lt;/author&gt; </P>
<P>&lt;publishDate&gt;2002-9-16&lt;/publishDate&gt; </P>
<P>&lt;price&gt;92.0&lt;/price&gt; </P>
<P>&lt;/book&gt; </P>
<P>&lt;/bookList&gt; </P>
<P>&lt;?xml-stylesheet href="bookList.html.xsl" type="text/xsl"?&gt; </P>
<P>在默认情况下，JDOM的Element类的getText()这类的方法不会过滤空白字符，如果你需要过滤，用setTextTrim() 。</P><img src ="http://www.blogjava.net/huhu/aggbug/11866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-09-03 10:26 <a href="http://www.blogjava.net/huhu/articles/11866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDom使用详解 </title><link>http://www.blogjava.net/huhu/articles/6679.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Fri, 24 Jun 2005 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/6679.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/6679.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/6679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/6679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/6679.html</trackback:ping><description><![CDATA[JDom是不错的API，算得上简单高效，最重要是已经成为jcp的一部分，这个咱得弄弄。不www.jdom.org上写文档的人实在太懒，文档出奇的少，流传得最广的恐怕是IBM上面的一篇《JDom让java&nbsp;XML变得容易》，不过这篇文章只涉及基本的读写操作，远不能胜任实际工作。花了两天时间，把JDom的基本操作整理出来了，涵盖了大部分的操作：元素、属性、命名空间、PI、DTD、Schema，应付一般的应用没什么问题。反正我没有在网上见到更加详尽的版本，你见过的话，请留下连接。暂时来不及编写详细的说明，先帖几段程序，对有经验的Java开发者来说，已经足够了。程序都已经经过了实际的测试，我使用的JDom是0.9版。 
<P>&nbsp;1、创建XML文档：<BR>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.input.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.output.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;CreateXML<BR><IMG id=Codehighlighter1_117_1365_Open_Image onclick="this.style.display='none'; Codehighlighter1_117_1365_Open_Text.style.display='none'; Codehighlighter1_117_1365_Closed_Image.style.display='inline'; Codehighlighter1_117_1365_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_117_1365_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_117_1365_Closed_Text.style.display='none'; Codehighlighter1_117_1365_Open_Image.style.display='inline'; Codehighlighter1_117_1365_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_117_1365_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_117_1365_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Create()<BR><IMG id=Codehighlighter1_144_1260_Open_Image onclick="this.style.display='none'; Codehighlighter1_144_1260_Open_Text.style.display='none'; Codehighlighter1_144_1260_Closed_Image.style.display='inline'; Codehighlighter1_144_1260_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_144_1260_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_144_1260_Closed_Text.style.display='none'; Codehighlighter1_144_1260_Open_Image.style.display='inline'; Codehighlighter1_144_1260_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_144_1260_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_144_1260_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_156_1180_Open_Image onclick="this.style.display='none'; Codehighlighter1_156_1180_Open_Text.style.display='none'; Codehighlighter1_156_1180_Closed_Image.style.display='inline'; Codehighlighter1_156_1180_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_156_1180_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_156_1180_Closed_Text.style.display='none'; Codehighlighter1_156_1180_Open_Image.style.display='inline'; Codehighlighter1_156_1180_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_156_1180_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_156_1180_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Document();&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ProcessingInstruction&nbsp;pi</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ProcessingInstruction(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">xml-stylesheet</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">type=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">text</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">xsl</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;href=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test.xsl</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;doc.addContent(pi);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Namespace&nbsp;ns&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Namespace.getNamespace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://www.bromon.org</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Namespace&nbsp;ns2&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Namespace.getNamespace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">other</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://www.w3c.org</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;root&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Element(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">根元素</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;ns);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;root.addNamespaceDeclaration(ns2);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;doc.setRootElement(root);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;el1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Element(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">元素一</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;el1.setAttribute(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">属性</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">属性一</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Text&nbsp;text1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Text(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">元素值</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;em&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Element(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">元素二</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">).addContent(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">第二个元素</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;el1.addContent(text1);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el1.addContent(em);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;el2&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Element(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">元素三</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">).addContent(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">第三个元素</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.addContent(el1);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.addContent(el2);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">缩进四个空格,自动换行,gb2312编码</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLOutputter&nbsp;outputter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLOutputter(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">GB2312</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputter.output(doc,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;FileWriter(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_1209_1253_Open_Image onclick="this.style.display='none'; Codehighlighter1_1209_1253_Open_Text.style.display='none'; Codehighlighter1_1209_1253_Closed_Image.style.display='inline'; Codehighlighter1_1209_1253_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1209_1253_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1209_1253_Closed_Text.style.display='none'; Codehighlighter1_1209_1253_Open_Image.style.display='inline'; Codehighlighter1_1209_1253_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1209_1253_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1209_1253_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;args[])<BR><IMG id=Codehighlighter1_1317_1356_Open_Image onclick="this.style.display='none'; Codehighlighter1_1317_1356_Open_Text.style.display='none'; Codehighlighter1_1317_1356_Closed_Image.style.display='inline'; Codehighlighter1_1317_1356_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1317_1356_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1317_1356_Closed_Text.style.display='none'; Codehighlighter1_1317_1356_Open_Image.style.display='inline'; Codehighlighter1_1317_1356_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1317_1356_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1317_1356_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CreateXML().Create();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;2、DTD验证的：<BR>&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.input.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.output.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLWithDTD<BR><IMG id=Codehighlighter1_118_621_Open_Image onclick="this.style.display='none'; Codehighlighter1_118_621_Open_Text.style.display='none'; Codehighlighter1_118_621_Closed_Image.style.display='inline'; Codehighlighter1_118_621_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_118_621_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_118_621_Closed_Text.style.display='none'; Codehighlighter1_118_621_Open_Image.style.display='inline'; Codehighlighter1_118_621_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_118_621_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_118_621_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;validate()<BR><IMG id=Codehighlighter1_147_534_Open_Image onclick="this.style.display='none'; Codehighlighter1_147_534_Open_Text.style.display='none'; Codehighlighter1_147_534_Closed_Image.style.display='inline'; Codehighlighter1_147_534_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_147_534_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_147_534_Closed_Text.style.display='none'; Codehighlighter1_147_534_Open_Image.style.display='inline'; Codehighlighter1_147_534_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_147_534_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_147_534_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_159_471_Open_Image onclick="this.style.display='none'; Codehighlighter1_159_471_Open_Text.style.display='none'; Codehighlighter1_159_471_Closed_Image.style.display='inline'; Codehighlighter1_159_471_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_159_471_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_159_471_Closed_Text.style.display='none'; Codehighlighter1_159_471_Open_Image.style.display='inline'; Codehighlighter1_159_471_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_159_471_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_159_471_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;SAXBuilder&nbsp;builder&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;SAXBuilder(</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;builder.setFeature(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://xml.org/sax/features/validation</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;,</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;builder.build(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;FileReader(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">author.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">搞掂</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;XMLOutputter&nbsp;outputter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLOutputter();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;outputter.output(doc,&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_494_526_Open_Image onclick="this.style.display='none'; Codehighlighter1_494_526_Open_Text.style.display='none'; Codehighlighter1_494_526_Closed_Image.style.display='inline'; Codehighlighter1_494_526_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_494_526_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_494_526_Closed_Text.style.display='none'; Codehighlighter1_494_526_Open_Image.style.display='inline'; Codehighlighter1_494_526_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_494_526_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_494_526_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String&nbsp;args[])<BR><IMG id=Codehighlighter1_579_615_Open_Image onclick="this.style.display='none'; Codehighlighter1_579_615_Open_Text.style.display='none'; Codehighlighter1_579_615_Closed_Image.style.display='inline'; Codehighlighter1_579_615_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_579_615_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_579_615_Closed_Text.style.display='none'; Codehighlighter1_579_615_Open_Image.style.display='inline'; Codehighlighter1_579_615_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_579_615_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_579_615_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLWithDTD().validate();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;需要说明的是，这个程序没有指明使用哪个DTD文件。DTD文件的位置是在XML中指定的，而且DTD不支持命名空间，一个XML只能引用一个DTD，所以程序直接读取XML中指定的DTD，程序本身不用指定。不过这样一来，好象就只能使用外部式的DTD引用方式了？高人指点。</P>
<P>&nbsp;3、XML&nbsp;Schema验证的：<BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&nbsp;import&nbsp;java.io.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.input.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;import&nbsp;org.jdom.output.</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLWithSchema<BR><IMG id=Codehighlighter1_122_767_Open_Image onclick="this.style.display='none'; Codehighlighter1_122_767_Open_Text.style.display='none'; Codehighlighter1_122_767_Closed_Image.style.display='inline'; Codehighlighter1_122_767_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_122_767_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_122_767_Closed_Text.style.display='none'; Codehighlighter1_122_767_Open_Image.style.display='inline'; Codehighlighter1_122_767_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_122_767_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_122_767_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;String&nbsp;xml</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;String&nbsp;schema</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test-schema.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;validate()<BR><IMG id=Codehighlighter1_211_761_Open_Image onclick="this.style.display='none'; Codehighlighter1_211_761_Open_Text.style.display='none'; Codehighlighter1_211_761_Closed_Image.style.display='inline'; Codehighlighter1_211_761_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_211_761_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_211_761_Closed_Text.style.display='none'; Codehighlighter1_211_761_Open_Image.style.display='inline'; Codehighlighter1_211_761_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_211_761_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_211_761_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_223_690_Open_Image onclick="this.style.display='none'; Codehighlighter1_223_690_Open_Text.style.display='none'; Codehighlighter1_223_690_Closed_Image.style.display='inline'; Codehighlighter1_223_690_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_223_690_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_223_690_Closed_Text.style.display='none'; Codehighlighter1_223_690_Open_Image.style.display='inline'; Codehighlighter1_223_690_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_223_690_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_223_690_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;SAXBuilder&nbsp;builder&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;SAXBuilder(</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">指定约束方式为XML&nbsp;schema</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;builder.setFeature(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://apache.org/xml/features/validation/schema</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;,&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">导入schema文件</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;builder.setProperty(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;,schema);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;builder.build(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;FileReader(xml));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">搞掂</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;XMLOutputter&nbsp;outputter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLOutputter();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;outputter.output(doc,&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(Exception&nbsp;e)<BR><IMG id=Codehighlighter1_713_753_Open_Image onclick="this.style.display='none'; Codehighlighter1_713_753_Open_Text.style.display='none'; Codehighlighter1_713_753_Closed_Image.style.display='inline'; Codehighlighter1_713_753_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_713_753_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_713_753_Closed_Text.style.display='none'; Codehighlighter1_713_753_Open_Image.style.display='inline'; Codehighlighter1_713_753_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_713_753_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_713_753_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">验证失败:</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>&nbsp;上面的程序就指出了要引入的XML&nbsp;Schema文件的位置。</P>
<P>&nbsp;系统默认输出是UTF-8，这有可能导致出现乱码。</P>
<P>&nbsp;读XML文档的技巧在网上已经泛滥，这里就没有再列出来。</P><img src ="http://www.blogjava.net/huhu/aggbug/6679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-06-24 15:26 <a href="http://www.blogjava.net/huhu/articles/6679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>