新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论DOM, SAX, XPath等。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DOM/SAX/XPath 』 → 有谁会java的jdom读写xml文件 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 39899 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 有谁会java的jdom读写xml文件 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     无药可救 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:53
      门派:XML.ORG.CN
      注册:2006/8/20

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给无药可救发送一个短消息 把无药可救加入好友 查看无药可救的个人资料 搜索无药可救在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看无药可救的博客楼主
    发贴心情 有谁会java的jdom读写xml文件

    会的高手们帮个忙.

       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/8/20 13:12:00
     
     wang_x_ke 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:11
      积分:123
      门派:XML.ORG.CN
      注册:2006/8/25

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wang_x_ke发送一个短消息 把wang_x_ke加入好友 查看wang_x_ke的个人资料 搜索wang_x_ke在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wang_x_ke的博客2
    发贴心情 
    DOM初步

    DOM是Document Object Model的缩写,即文档对象模型。前面说过,XML将数据组织为一颗树,所以DOM就是对这颗树的一个对象描叙。通俗的说,就是通过解析XML文档,为XML文档在逻辑上建立一个树模型,树的节点是一个个对象。我们通过存取这些对象就能够存取XML文档的内容。

    下面我们来看一个简单的例子,看看在DOM中,我们是如何来操作一个XML文档的。

    这是一个XML文档,也是我们要操作的对象:

    <?xml version="1.0" encoding="UTF-8"?><messages><message>Good-bye serialization, hello Java!</message></messages>


    下面,我们需要把这个文档的内容解析到一个个的Java对象中去供程序使用,利用JAXP,我们只需几行代码就能做到这一点。首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象:

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();


    我们在这里使用DocumentBuilderFacotry的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。所以当在不同的解析器之间进行切换时,只需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。这个工厂模式的具体实现,可以参看下面的类图。

    DocumentBuilder db = dbf.newDocumentBuilder();


    当获得一个工厂对象后,使用它的静态方法newDocumentBuilder()方法可以获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器。但具体是哪一种解析器,微软的或者IBM的,对于程序而言并不重要。

    然后,我们就可以利用这个解析器来对XML文档进行解析了:

    Document doc = db.parse("c:/xml/message.xml");


    DocumentBuilder的parse()方法接受一个XML文档名作为输入参数,返回一个Document对象,这个Document对象就代表了一个XML文档的树模型。以后所有的对XML文档的操作,都与解析器无关,直接在这个Document对象上进行操作就可以了。而具体对Document操作的方法,就是由DOM所定义的了。


    Jaxp支持W3C所推荐的DOM 2。如果你对DOM很熟悉,那么下面的内容就很简单了:只需要按照DOM的规范来进行方法调用就可以。当然,如果你对DOM不清楚,也不用着急,后面我们会有详细的介绍。在这儿,你所要知道并牢记的是:DOM是用来描叙XML文档中的数据的模型,引入DOM的全部原因就是为了用这个模型来操作XML文档的中的数据。DOM规范中定义有节点(即对象)、属性和方法,我们通过这些节点的存取来存取XML的数据。

    从上面得到的Document对象开始,我们就可以开始我们的DOM之旅了。使用Document对象的getElementsByTagName()方法,我们可以得到一个NodeList对象,一个Node对象代表了一个XML文档中的一个标签元素,而NodeList对象,观其名而知其意,所代表的是一个Node对象的列表:

    NodeList nl = doc.getElementsByTagName("message");


    我们通过这样一条语句所得到的是XML文档中所有<message>标签对应的Node对象的一个列表。然后,我们可以使用NodeList对象的item()方法来得到列表中的每一个Node对象:

    Node my_node = nl.item(0);


    当一个Node对象被建立之后,保存在XML文档中的数据就被提取出来并封装在这个Node中了。在这个例子中,要提取Message标签内的内容,我们通常会使用Node对象的getNodeValue()方法:

    String message = my_node.getFirstChild().getNodeValue();

    请注意,这里还使用了一个getFirstChild()方法来获得message下面的第一个子Node对象。虽然在message标签下面除了文本外并没有其它子标签或者属性,但是我们坚持在这里使用getFirseChild()方法,这主要和W3C对DOM的定义有关。W3C把标签内的文本部分也定义成一个Node,所以先要得到代表文本的那个Node,我们才能够使用getNodeValue()来获取文本的内容。

    现在,既然我们已经能够从XML文件中提取出数据了,我们就可以把这些数据用在合适的地方,来构筑应用程序。

    下面的内容,我们将更多的关注DOM,为DOM作一个较为详细的解析,使我们使用起来更为得心应手。

    DOM详解
    1.基本的DOM对象

    DOM的基本对象有5个:Document,Node,NodeList,Element和Attr。下面就这些对象的功能和实现的方法作一个大致的介绍。

    Document对象代表了整个XML的文档,所有其它的Node,都以一定的顺序包含在Document对象之内,排列成一个树形的结构,程序员可以通过遍历这颗树来得到XML文档的所有的内容,这也是对XML文档操作的起点。我们总是先通过解析XML源文件而得到一个Document对象,然后再来执行后续的操作。此外,Document还包含了创建其它节点的方法,比如createAttribut()用来创建一个Attr对象。它所包含的主要的方法有:

    createAttribute(String):用给定的属性名创建一个Attr对象,并可在其后使用setAttributeNode方法来放置在某一个Element对象上面。

    createElement(String):用给定的标签名创建一个Element对象,代表XML文档中的一个标签,然后就可以在这个Element对象上添加属性或进行其它的操作。

    createTextNode(String):用给定的字符串创建一个Text对象,Text对象代表了标签或者属性中所包含的纯文本字符串。如果在一个标签内没有其它的标签,那么标签内的文本所代表的Text对象是这个Element对象的唯一子对象。

    getElementsByTagName(String):返回一个NodeList对象,它包含了所有给定标签名字的标签。

    getDocumentElement():返回一个代表这个DOM树的根节点的Element对象,也就是代表XML文档根元素的那个对象。

    Node对象是DOM结构中最为基本的对象,代表了文档树中的一个抽象的节点。在实际使用的时候,很少会真正的用到Node这个对象,而是用到诸如Element、Attr、Text等Node对象的子对象来操作文档。Node对象为这些对象提供了一个抽象的、公共的根。虽然在Node对象中定义了对其子节点进行存取的方法,但是有一些Node子对象,比如Text对象,它并不存在子节点,这一点是要注意的。Node对象所包含的主要的方法有:

    appendChild(org.w3c.dom.Node):为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去。

    getFirstChild():如果节点存在子节点,则返回第一个子节点,对等的,还有getLastChild()方法返回最后一个子节点。

    getNextSibling():返回在DOM树中这个节点的下一个兄弟节点,对等的,还有getPreviousSibling()方法返回其前一个兄弟节点。

    getNodeName():根据节点的类型返回节点的名称。

    getNodeType():返回节点的类型。

    getNodeValue():返回节点的值。

    hasChildNodes():判断是不是存在有子节点。

    hasAttributes():判断这个节点是否存在有属性。

    getOwnerDocument():返回节点所处的Document对象。

    insertBefore(org.w3c.dom.Node new,org.w3c.dom.Node ref):在给定的一个子对象前再插入一个子对象。

    removeChild(org.w3c.dom.Node):删除给定的子节点对象。

    replaceChild(org.w3c.dom.Node new,org.w3c.dom.Node old):用一个新的Node对象代替给定的子节点对象。

    NodeList对象,顾名思义,就是代表了一个包含了一个或者多个Node的列表。可以简单的把它看成一个Node的数组,我们可以通过方法来获得列表中的元素:

    GetLength():返回列表的长度。

    Item(int):返回指定位置的Node对象。

    Element对象代表的是XML文档中的标签元素,继承于Node,亦是Node的最主要的子对象。在标签中可以包含有属性,因而Element对象中有存取其属性的方法,而任何Node中定义的方法,也可以用在Element对象上面。

    getElementsByTagName(String):返回一个NodeList对象,它包含了在这个标签中其下的子孙节点中具有给定标签名字的标签。

    getTagName():返回一个代表这个标签名字的字符串。

    getAttribute(String):返回标签中给定属性名称的属性的值。在这儿需要主要的是,应为XML文档中允许有实体属性出现,而这个方法对这些实体属性并不适用。这时候需要用到getAttributeNodes()方法来得到一个Attr对象来进行进一步的操作。

    getAttributeNode(String):返回一个代表给定属性名称的Attr对象。

    Attr对象代表了某个标签中的属性。Attr继承于Node,但是因为Attr实际上是包含在Element中的,它并不能被看作是Element的子对象,因而在DOM中Attr并不是DOM树的一部分,所以Node中的getparentNode(),getpreviousSibling()和getnextSibling()返回的都将是null。也就是说,Attr其实是被看作包含它的Element对象的一部分,它并不作为DOM树中单独的一个节点出现。这一点在使用的时候要同其它的Node子对象相区别。

    需要说明的是,上面所说的DOM对象在DOM中都是用接口定义的,在定义的时候使用的是与具体语言无关的IDL语言来定义的。因而,DOM其实可以在任何面向对象的语言中实现,只要它实现了DOM所定义的接口和功能就可以了。同时,有些方法在DOM中并没有定义,是用IDL的属性来表达的,当被映射到具体的语言时,这些属性被映射为相应的方法。

    2.DOM实例

    有了上面的介绍,相信你对DOM理解的更多了吧。下面的例子将让你对DOM更加熟悉起来。

    先说说这个例子到底要做的是什么吧,我们希望在一个名为link.xml文件中保存了一些URL地址,通过一个简单的程序,我们可以通过DOM把这些URL读出并显示出来,也可以反过来向这个XML文件中写入加入的URL地址。很简单,却很实用,也足够来例示DOM的绝大部分用法了。

    XML文件本身不复杂,就不给出它的DTD了。link.xml:


    <?xml version="1.0" standalone="yes"?><links><link><text>JSP Insider</text><url newWindow="no">http://www.jspinsider.com</url><author>JSP Insider</author><date><day>2</day><month>1</month><year>2001</year></date><description>A JSP information site.</description></link><link><text>The makers of Java</text><url newWindow="no">http://java.sun.com</url><author>Sun Microsystems</author><date><day>3</day><month>1</month><year>2001</year></date><description>Sun Microsystem's website.</description></link><link><text>The standard JSP container</text><url newWindow="no">http://jakarta.apache.org</url><author>Apache Group</author><date><day>4</day><month>1</month><year>2001</year></date><description>Some great software.</description></link></links>

    第一个程序我们称为xmldisplay.java,具体的程序清单可以在附件中找到。主要的功能就是读取这个XML文件中各个节点的内容,然后在格式化输出在System.out上,我们来看看这个程序:

    import javax.xml.parsers.*;import org.w3c.dom.*;

    这是引入必要的类,因为在这里使用的是Sun所提供的XML解析器,因而需要引入java.xml.parsers包,其中包含了有DOM解析器和SAX解析器的具体实现。org.w3c.dom包中定义了w3c所制定的DOM接口。

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder
    builder=factory.newDocumentBuilder();
    Document doc=builder.parse("links.xml");
    doc.normalize();

    除了上面讲到的,还有一个小技巧,对Document对象调用normalize(),可以去掉XML文档中作为格式化内容的空白而映射在DOM树中的不必要的Text Node对象。否则你得到的DOM树可能并不如你所想象的那样。特别是在输出的时候,这个normalize()更为有用。

    NodeList links =doc.getElementsByTagName("link");

    刚才说过,XML文档中的空白符也会被作为对象映射在DOM树中。因而,直接调用Node方法的getChildNodes方法有时候会有些问题,有时不能够返回所期望的NodeList对象。解决的办法是使用Element的getElementByTagName(String),返回的NodeLise就是所期待的对象了。然后,可以用item()方法提取想要的元素。

    for (int i=0;i<links.getLength();i++){Element link=(Element) links.item(i);System.out.print("Content: ");System.out.println(link.getElementsByTagName("text").item(0).getFirstChild().getNodeValue());System.out.print("URL: ");System.out.println(link.getElementsByTagName("url").item(0).getFirstChild().getNodeValue());System.out.print("Author: ");System.out.println(link.getElementsByTagName("author").item(0).getFirstChild().getNodeValue());System.out.print("Date: ");Element linkdate=(Element) link.getElementsByTagName("date").item(0);String day=linkdate.getElementsByTagName("day").item(0).getFirstChild().getNodeValue();String month=linkdate.getElementsByTagName("month").item(0).getFirstChild().getNodeValue();String year=linkdate.getElementsByTagName("year").item(0).getFirstChild().getNodeValue();System.out.println(day+"-"+month+"-"+year);System.out.print("Description: ");System.out.println(link.getElementsByTagName("description").item(0).getFirstChild().getNodeValue());System.out.println();}

    上面的代码片断就完成了对XML文档内容的格式化输出。只要注意到一些细节的问题,比如getFirstChile()方法和getElementsByTagName()方法的使用,这些还是比较容易的。

    下面的内容,就是在修改了DOM树后重新写入到XML文档中去的问题了。这个程序名为xmlwrite.java。在JAXP1.0版本中,并没有直接的类和方法能够处理XML文档的写入问题,需要借助其它包中的一些辅助类。而在JAXP1.1版本中,引入了对XSLT的支持,所谓XSLT,就是对XML文档进行变换(Translation)后,得到一个新的文档结构。利用这个新加入的功能,我们就能够很方便的把新生成或者修改后的DOM树从新写回到XML文件中去了,下面我们来看看代码的实现,这段代码的主要功能是向links.xml文件中加入一个新的link节点:

    import javax.xml.parsers.*;import javax.xml.transform.*;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.*;

    新引入的java.xml.transform包中的几个类,就是用来处理XSLT变换的。

    我们希望在上面的XML文件中加入一个新的link节点,因而首先还是要读入links.xml文件,构建一个DOM树,然后再对这个DOM树进行修改(添加节点),最后把修改后的DOM写回到links.xml文件中:

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document doc=builder.parse("links.xml");doc.normalize();//---取得变量----String text="Hanzhong's Homepage";String url="www.hzliu.com";String author="Hzliu Liu";String discription="A site from Hanzhong Liu, give u lots of suprise!!!";

    为了看清重点,简化程序,我们把要加入的内容硬编码到记忆String对象中,而实际操作中,往往利用一个界面来提取用户输入,或者通过JDBC从数据库中提取想要的内容。

    Text textseg;Element link=doc.createElement("link");

    首先应该明了的是,无论什么类型的Node,Text型的也好,Attr型的也好,Element型的也好,它们的创建都是通过Document对象中的createXXX()方法来创建的(XXX代表具体要创建的类型),因此,我们要向XML文档中添加一个link项目,首先要创建一个link对象:

    Element linktext=doc.createElement("text");textseg=doc.createTextNode(text);linktext.appendChild(textseg);link.appendChild(linktext);Element linkurl=doc.createElement("url");textseg=doc.createTextNode(url);linkurl.appendChild(textseg);link.appendChild(linkurl);Element linkauthor=doc.createElement("author");textseg=doc.createTextNode(author);linkauthor.appendChild(textseg);link.appendChild(linkauthor);java.util.Calendar rightNow = java.util.Calendar.getInstance();String day=Integer.toString(rightNow.get(java.util.Calendar.DAY_OF_MONTH));String month=Integer.toString(rightNow.get(java.util.Calendar.MONTH));String year=Integer.toString(rightNow.get(java.util.Calendar.YEAR));Element linkdate=doc.createElement("date");Element linkdateday=doc.createElement("day");textseg=doc.createTextNode(day);linkdateday.appendChild(textseg);Element linkdatemonth=doc.createElement("month");textseg=doc.createTextNode(month);linkdatemonth.appendChild(textseg);Element linkdateyear=doc.createElement("year");textseg=doc.createTextNode(year);linkdateyear.appendChild(textseg);linkdate.appendChild(linkdateday);linkdate.appendChild(linkdatemonth);linkdate.appendChild(linkdateyear);link.appendChild(linkdate);Element linkdiscription=doc.createElement("description");textseg=doc.createTextNode(discription);linkdiscription.appendChild(textseg);link.appendChild(linkdiscription);

    创建节点的过程可能有些千篇一律,但需要注意的地方是,对Element中所包含的text(在DOM中,这些text也是代表了一个Node的,因此也必须为它们创建相应的node),不能直接用Element对象的setNodeValue()方法来设置这些text的内容,而需要用创建的Text对象的setNodeValue()方法来设置文本,这样才能够把创建的Element和其文本内容添加到DOM树中。看看前面的代码,你会更好的理解这一点:

    doc.getDocumentElement().appendChild(link);

    最后,不要忘记把创建好的节点添加到DOM树中。Document类的getDocumentElement()方法,返回代表文档根节点的Element对象。在XML文档中,根节点一定是唯一的。

    TransformerFactory tFactory =TransformerFactory.newInstance();Transformer transformer = tFactory.newTransformer();DOMSource source = new DOMSource(doc);StreamResult result = new StreamResult(new java.io.File("links.xml"));transformer.transform(source, result);

    然后就是用XSLT把DOM树输出了。这里的TransformerFactory也同样应用了工厂模式,使得具体的代码同具体的变换器无关。实现的方法和DocumentBuilderFactory相同,这儿就不赘述了。Transformer类的transfrom方法接受两个参数、一个数据源Source和一个输出目标Result。这里分别使用的是DOMSource和StreamResult,这样就能够把DOM的内容输出到一个输出流中,当这个输出流是一个文件的时候,DOM的内容就被写入到文件中去了。


    转载的,代码有点乱啊!不过应该不会影响阅读吧!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/8/25 16:08:00
     
     wang_x_ke 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:11
      积分:123
      门派:XML.ORG.CN
      注册:2006/8/25

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wang_x_ke发送一个短消息 把wang_x_ke加入好友 查看wang_x_ke的个人资料 搜索wang_x_ke在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wang_x_ke的博客3
    发贴心情 
    jdom的简单例子:

      Jdom是用Java语言读、写、操作XML的新API函数。Jason Hunter 和 Brett McLaughlin公开发布了它的测试版本。在直觉、简单和高效的前提下,这些API函数被最大限度的优化。在接下来的篇幅里,Hunter 和 McLaughlin介绍怎么用Jdom去读写一个已经存在的XML文档。

      Jdom是一个开源的api,它以直接易懂的方式向java程序员描述XML文档和文档的内容。就象名字揭示的那样,Jdom是为java优化的。为使用XML文档提供一个低消耗的方法。Jdom的使用者可以不必掌握太多的XML的知识就可以完成想要的操作。

      Jdom可以和已有的XML技术如Simple API for XML (SAX)和 Document Object Model (DOM)相互协作.然而,它并不是简单的从这些api中提取出一些。Jdom从这些已存在的技术中吸收了好的方面,自己建立了一套新的类和接口,用一个Jdom用户的话来说就是:“这些接口是我从一开始阅读org.w3c.dom就期待的”;Jdom可以读入SAX或是DOM的内容,也可以输出SAX或DOM可以接收的格式。这个能力可以使Jdom很好的和已有的用SAX或DOM建立的系统之间整合。

      Jdom的原则

      第一条并且是最重要的一条就是Jdom的api函数被设计成对java程序员来说是简单易懂的。其他的XML解析函数被设计成语言通用的(支持相同的api函数在java,c++,甚至是javascript中)。Jdom利用了java的优秀的特征,如:方法重载、回收机制,和后台处理等。

      为了能够简单易用,这些函数不得不以程序员喜欢的形式来描绘XML文档。例如:程序员想的到的一个元素的文本内容是什么样子的呢?

    <element>This is my text content</element>

      在一些api中,元素的文本内容仅被当作是一个元素的孩子节点。从技术角度来说,这个设计需要下面的代码才能访问到元素的内容:

    String content = element.getFirstChild().getValue();

      Jdom用一种更简单易用的方法来取得元素的内容:

    String text = element.getText();

      Jdom尽可能的减少程序员的工作量。依据拇指规则,Jdom应该用20%或是更少的努力来完成80%或是更多的java/xml方面的问题。这并不是说Jdom只是支持80%的XML规范(实际上我们希望Jdom100%的支持XML规范)。这个拇指规则是说有些东西可以加进去,但是没有必要。这些api函数应该保持简洁。

      Jdom的第二条原则是说Jdom应该是快速的和轻量级的。调入和执行文档应该快速,内存的消耗应该尽量小。Jdom的设计明显是遵循这个原则。例如,就算在开始的时候,不太协调的操作已经比DOM快,但是比SAX显的粗糙。尽管这样,Jdom还是有许多SAX没有的优点。


      那么,你需要Jdom吗?这真是一个很好的问题。已经有了存在的标准,为什么还要去发明一个新的呢?答案是Jdom解决了现有的标准解决不了的问题。

      DOM完全在内存中描述一个元素树。它是一个大的api,被设计操作几乎所有可能的XML任务。它也必须有相同的api去支持不同的语言。因为这些限制,对那些习惯使用java的特征,如方法重载、简单的set,get方法的java程序员来说,就很不习惯。DOM还需要大量的内存和较高的主频,这使它很难和许多轻量级的web应用一起工作。

      SAX没有在内存中建立一个元素树,它用事情发展的方式来描述。例如:它报告每个读到的开始标记和结束标记。这种处理方式使它成为一个轻量级的快速读取的api。然而,这种事件处理方式对服务器端的java程序员来说不够直观。SAX也不支持修改XML文档和随机读取。

      Jdom试图组合DOM和SAX的优点。它被设计成一个可以在小内存上快速执行轻量级api 。Jdom也支持随机读取整个文档,但是令人惊奇的是它并不需要把整个文档读到内存中。这个api支持未来的当需要时才读入信息的次轻量级操作。还有,Jdom通过标准的构造器和set方法支持XML文档的修改。

      获取XML文档

      Jdom用org.Jdom.Document类的一个实例来描述一个XML文档。这个文档类是一个轻重量级的,它可以包括文档类型、多处理指令的对象、一个根元素和注释对象。你可以不需要构造器而从草稿构造一个文档。

    Document doc = new Document(new Element("rootElement"));

      本文后面我们会讨论从草稿构造一个XML文档是多么的容易。但是现在,我们从一个已存在的文件、一个流、或是一个URL路径中构造我们的文档。

    SAXBuilder builder = new SAXBuilder();
    Document doc = builder.build(url);

      你可以用org.Jdom.input包中提供的构造类从任何数据源中构造文档。最近,有两种构造方式:SAXBuilder 和 DOMBuilder。SAXBuilder用sax解析器从文件中构造文档。SAXBuilder侦听sax事件并从内存中建立一个相应的文档。这种方式非常快(基本上和sax一样快),这也是我们推荐的方式。DOMBuilder是另一种可选的方式,它从一个存在的org.w3c.dom.Document对象中建立Jdom文档。它允许Jdom轻松的和构建DOM树的工具实现接口。

      Jdom的速度有值得期待的提高的潜力通过一个延期的构造器的完成。这个构造器检查XML数据源,但当请求的时候才对它解析。例如:文档的属性当不访问时是不需要解析的。

      构造器仍在发展,可以通sql查询、ldap查询和其他的数据格式来够造Jdom文档。所以,一旦进到内存中,文档就和建造它的工具没有关系了。

      SAXBuilder 和 DOMBuilder构造器允许用户指明他们是否应该轮换,以便确定哪个解析器时间执行解析的任务。

    public SAXBuilder(String parserClass, boolean validation);
    public DOMBuilder(String adapterClass, boolean validation);

      默认的是用apache的开源 Xerces解析器并且是关闭轮换的。你应该注到DOMBuilder不象一个解析类,倒更象一个适配类。这是因为不是所有的DOM解析器都是相同的api。为了仍让用户选择喜欢的解析器,Jdom使用一个对所有的dom解析器适用的公共的api的适配类。这个适配类支持所有流行的dom解析器,包括Apache 的 Xerces, Crimson,IBM 的 XML4J, Sun 的 Project X, 和Oracle 的 parsers V1 and V2.每一个解析器通过正确的调用别的解析器的方法执行标准的接口。这有点象jaxp,除了它支持jaxp所不支持的新的解析器。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/8/25 16:12:00
     
     lmjanson 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:5
      积分:78
      门派:XML.ORG.CN
      注册:2006/4/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lmjanson发送一个短消息 把lmjanson加入好友 查看lmjanson的个人资料 搜索lmjanson在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看lmjanson的博客4
    发贴心情 
    顶!我也正在看DOM还很茫然,不晓得怎么着手呢~~看了你楼上的帖子还是顶哈!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/9/10 11:29:00
     
     allrr 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:6
      积分:102
      门派:XML.ORG.CN
      注册:2007/1/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给allrr发送一个短消息 把allrr加入好友 查看allrr的个人资料 搜索allrr在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看allrr的博客5
    发贴心情 
    UP!!学习中。。。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/1/11 14:29:00
     
     chys2007 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:58
      门派:XML.ORG.CN
      注册:2007/1/16

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给chys2007发送一个短消息 把chys2007加入好友 查看chys2007的个人资料 搜索chys2007在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看chys2007的博客6
    发贴心情 
    UP!!学习中。。。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/1/16 18:46:00
     
     zss0109211 帅哥哟,离线,有人找我吗?白羊座1982-4-15
      
      
      等级:大一新生
      文章:0
      积分:55
      门派:XML.ORG.CN
      注册:2007/4/1

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zss0109211发送一个短消息 把zss0109211加入好友 查看zss0109211的个人资料 搜索zss0109211在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zss0109211的博客7
    发贴心情 
    发现用TransformerFactory 重新写入数据后,会出现文件乱码,如何解决
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/29 1:11:00
     
     kukumaluw 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:13
      积分:107
      门派:XML.ORG.CN
      注册:2007/7/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给kukumaluw发送一个短消息 把kukumaluw加入好友 查看kukumaluw的个人资料 搜索kukumaluw在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看kukumaluw的博客8
    发贴心情 
    好好学习!!!!!11

    ----------------------------------------------
    动荡的是路途,是时间,不是我的心。踏过布满荆棘的木板,流着血找到彼岸。左手盛装着烟火和寂寞,右手翻涌着回忆和过错。忘记要对佛祖说些什么,有只云雀轻轻轻轻掠过……

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/7/11 10:58:00
     
     263661484 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:55
      门派:XML.ORG.CN
      注册:2008/5/7

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给263661484发送一个短消息 把263661484加入好友 查看263661484的个人资料 搜索263661484在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看263661484的博客9
    发贴心情 
    学习学习``
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/5/7 17:50:00
     
     duyingli2009 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:2
      积分:59
      门派:XML.ORG.CN
      注册:2009/5/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给duyingli2009发送一个短消息 把duyingli2009加入好友 查看duyingli2009的个人资料 搜索duyingli2009在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看duyingli2009的博客10
    发贴心情 ding
    顶起
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/5/25 21:33:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DOM/SAX/XPath 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/18 14:04:17

    本主题贴数12,分页: [1] [2]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    1,136.719ms