QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5873|回复: 7
打印 上一主题 下一主题

[求助]如何把java中的输出结果放入xml中?

[复制链接]
字体大小: 正常 放大
wyxueli        

1

主题

0

听众

18

积分

升级  13.68%

该用户从未签到

新人进步奖

跳转到指定楼层
#
发表于 2005-7-17 13:12 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<>如何把java中的输出结果放入xml中?</P>. F) I. j& u7 @1 |
<>谢谢赐教</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
Paul_Sing 实名认证       

0

主题

4

听众

43

积分

升级  40%

  • TA的每日心情
    开心
    2014-10-14 13:54
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    自我介绍
    软件工程硕士
    回复

    使用道具 举报

    0

    主题

    0

    听众

    4

    积分

    升级  80%

    该用户从未签到

    自我介绍
    888888
    回复

    使用道具 举报

    8

    主题

    5

    听众

    194

    积分

    升级  47%

  • TA的每日心情
    无聊
    2012-9-24 18:42
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    回复

    使用道具 举报

    1

    主题

    2

    听众

    25

    积分

    升级  21.05%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    yirongshu        

    0

    主题

    2

    听众

    182

    积分

    升级  41%

    该用户从未签到

    回复

    使用道具 举报

    ilikenba 实名认证       

    1万

    主题

    49

    听众

    2万

    积分

  • TA的每日心情
    奋斗
    2024-6-23 05:14
  • 签到天数: 1043 天

    [LV.10]以坛为家III

    社区QQ达人 新人进步奖 优秀斑竹奖 发帖功臣

    群组: 万里江山

    群组: sas讨论小组

    群组: 长盛证券理财有限公司

    群组: C 语言讨论组

    群组: Matlab讨论组

    网上看到的几个代码,不知道有没有用,没有测试过!

    <>1.使用parseconfig方法</P>
    % n* W2 A: k" }% x: p( g; C( m<>import javax.xml.parsers.*;<BR>import org.w3c.dom.Element;<BR>import org.w3c.dom.Document;<BR>import org.w3c.dom.NodeList;</P>
    , ]* e$ F0 l% O. _& ?/ ~% O<>public ParseConfig(LinkedList input , LinkedList output) {<BR>    //所要解析的xml文件<BR>    fileURI = ( (String)new File(System.getProperty("user.dir")).getPath()) +<BR>        "<a>\\System.xml</A>";<BR>    //////////////////System.out.println(fileURI);<BR>    try {<BR>      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();<BR>      DocumentBuilder db = dbf.newDocumentBuilder();<BR>      Document doc = db.parse(fileURI);<BR>      Element elmt = doc.getDocumentElement();<BR>      NodeList nl = elmt.getElementsByTagName("DataSource");//DataSource是xml文件中的一个标签</P>
    8 x4 O- F; t1 v& U! s2 m, {# a. C+ x<>      for (int i = 0; i &lt; nl.getLength(); i++) {<BR>        Element elmtCurrent = (Element) nl.item(i);<BR>        NodeList nlCurrent = elmtCurrent.getElementsByTagName("DS");<BR>        if (nlCurrent.item(0).getFirstChild().getNodeValue().equals(ds)) {<BR>          DS = nlCurrent.item(0).getFirstChild().getNodeValue();<BR>          //////////////////System.out.println(" DS          is : " + DS);</P>& q$ }7 ^" O8 a, w7 e
    <>          nlCurrent = elmtCurrent.getElementsByTagName("URL");<BR>          URL = nlCurrent.item(0).getFirstChild().getNodeValue();<BR>          //////////////////System.out.println(" URL         is : " + URL);</P>! n! c5 h% D  M: s5 [5 Z
    <>          nlCurrent = elmtCurrent.getElementsByTagName("Driver");<BR>          Driver = nlCurrent.item(0).getFirstChild().getNodeValue();<BR>          //////////////////System.out.println(" Driver      is : " + Driver);</P>
    % e) X8 H2 V4 V) }3 u<>          nlCurrent = elmtCurrent.getElementsByTagName("IP");<BR>          IP = nlCurrent.item(0).getFirstChild().getNodeValue();<BR>          //////////////////System.out.println(" IP          is : " + IP);</P>
      _5 D: \1 v1 i4 N4 M* J<>          nlCurrent = elmtCurrent.getElementsByTagName("UseID");<BR>          UserID = nlCurrent.item(0).getFirstChild().getNodeValue();<BR>          //////////////////System.out.println(" UseID       is : " + UserID);</P>( d$ p  O; Z9 {# h) t; x5 ^8 [
    <>          nlCurrent = elmtCurrent.getElementsByTagName("UsePassword");<BR>          UserPassword = nlCurrent.item(0).getFirstChild().getNodeValue();<BR>          //////////////////System.out.println(" UsePassword is : " + UserPassword);<BR>        } else<BR>          continue;<BR>      }<BR>    } catch (IOException ie) {<BR>      ie.printStackTrace();<BR>    } catch (SAXException se) {<BR>      se.printStackTrace();<BR>    } catch (ParserConfigurationException pce) {<BR>      pce.printStackTrace();<BR>    }<BR>    createcon();<BR>    process(input , output);<BR>    release();<BR>  }</P>3 q2 i( M+ {1 B1 h) W
    <>  public void createcon(){<BR>    try {<BR>      Class.forName(Driver);<BR>    } catch (ClassNotFoundException cnfe) {<BR>      cnfe.printStackTrace();<BR>    }</P>
    0 q: G1 f" [/ t/ T<>    try {<BR>      con = DriverManager.getConnection(URL, UserID, UserPassword);<BR>    } catch (SQLException sqle) {<BR>      sqle.printStackTrace();<BR>    }<BR>  }<BR></P>
    3 O5 o, S6 j. i  B+ a. W8 @( E<>2.使用jdom 1.1写xml文件</P>: s7 }1 t; J3 }# d1 |5 R' p" X
    <>import java.io.FileOutputStream;</P>
    ( k' d( }' x0 V( z<>import org.jdom.Document;<BR>import org.jdom.Element;<BR>import org.jdom.output.XMLOutputter;<BR>public class Test {<BR>/**<BR> * 生成需要的XML文件<BR> *<BR> */<BR>private boolean doCreateXMLFile(Document doc , String filePath) {<BR>try{<BR>XMLOutputter xmlout= new XMLOutputter("",true,"gb2312");//08/19 EDIT<BR>FileOutputStream output = new FileOutputStream(filePath);<BR>xmlout.output(doc,output);<BR>xmlout.clone();<BR>xmlout = null;<BR>output.close();<BR>output = null;<BR>}catch(Exception e){<BR>e.printStackTrace();<BR>return false;<BR>}<BR>return true;<BR>}</P>. f' n! v1 @2 m! z
    <>public static void main(String args[]){<BR>byte[] aa = "aa".getBytes();<BR>System.out.println(aa);<BR>Document document = new Document();<BR>Element root = new Element("Message");<BR>root.setAttribute("vendor","wiscom");<BR>Element event = new Element("Event");<BR>event.setAttribute("target" , "uid");<BR>event.setAttribute("evenTime" , "" + System.currentTimeMillis());<BR>event.setAttribute("eventType" , "cc");<BR>Element attributeValuePairElem = new Element("AttributeValuePair");<BR>Element attributeElem = new Element("Attribute");<BR>attributeElem.setAttribute("name" , "email" );<BR>Element valueElem = new Element("Value");<BR>valueElem.setText("<a href="mailttyzhg@wiscom.com.cn" target="_blank" >tyzhg@wiscom.com.cn</A>");<BR>attributeElem.addContent(valueElem);<BR>attributeValuePairElem.addContent(attributeElem);<BR>event.addContent(attributeValuePairElem);</P>  m5 ~, C2 I# T/ }
    <>root.addContent(event);<BR>document.setRootElement(root);</P>% |6 b7 R$ m2 o6 Q$ D6 P
    <>Test test = new Test();<BR>test.doCreateXMLFile(document , "D:\\aa.xml");<BR>}<BR>}<BR></P>
    ! h" k4 ]$ f7 |<>3.使用JDOM+XPATH</P>% G, V  }+ q6 f2 r
    <>Document doc = null;<BR>   SAXBuilder sb = new SAXBuilder();<BR>   doc = sb.build(xml文件);<BR></P>
    回复

    使用道具 举报

    ilikenba 实名认证       

    1万

    主题

    49

    听众

    2万

    积分

  • TA的每日心情
    奋斗
    2024-6-23 05:14
  • 签到天数: 1043 天

    [LV.10]以坛为家III

    社区QQ达人 新人进步奖 优秀斑竹奖 发帖功臣

    群组: 万里江山

    群组: sas讨论小组

    群组: 长盛证券理财有限公司

    群组: C 语言讨论组

    群组: Matlab讨论组

    <>Java与XML联合编程之DOM篇<BR>(扬帆 2001年10月08日 17:16)</P>
    3 F. A3 `6 f% }, |& g: V<>DOM初步 <BR>DOM是Document Object Model的缩写,即文档对象模型。前面说过,XML将数据组织为一颗树,所以DOM就是对这颗树的一个对象描叙。通俗的说,就是通过解析XML文档,为XML文档在逻辑上建立一个树模型,树的节点是一个个对象。我们通过存取这些对象就能够存取XML文档的内容。 </P>
    # Z9 V. }3 K$ ^) w& ]. m0 F! F$ g( F<>下面我们来看一个简单的例子,看看在DOM中,我们是如何来操作一个XML文档的。 </P>
    + c, H5 x7 E6 T$ t<>这是一个XML文档,也是我们要操作的对象: <BR>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;messages&gt;&lt;message&gt;Good-bye serialization, hello Java!&lt;/message&gt;&lt;/messages&gt;</P>
    4 ^0 ^8 U2 _, X/ ]<>下面,我们需要把这个文档的内容解析到一个个的Java对象中去供程序使用,利用JAXP,我们只需几行代码就能做到这一点。首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象: <BR>DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();</P>
      x% U( Y& d; m# y% R<>我们在这里使用DocumentBuilderFacotry的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。所以当在不同的解析器之间进行切换时,只需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。这个工厂模式的具体实现,可以参看下面的类图。 <BR>DocumentBuilder db = dbf.newDocumentBuilder();</P>2 \( K4 K% D& i! x: |
    <>当获得一个工厂对象后,使用它的静态方法newDocumentBuilder()方法可以获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器。但具体是哪一种解析器,微软的或者IBM的,对于程序而言并不重要。 </P>
    & G+ y1 f1 a) u8 E. W/ D0 e<>然后,我们就可以利用这个解析器来对XML文档进行解析了: <BR>Document doc = db.parse("c:/xml/message.xml");</P>; {. K. g9 v# W; Q2 w, _
    <>DocumentBuilder的parse()方法接受一个XML文档名作为输入参数,返回一个Document对象,这个Document对象就代表了一个XML文档的树模型。以后所有的对XML文档的操作,都与解析器无关,直接在这个Document对象上进行操作就可以了。而具体对Document操作的方法,就是由DOM所定义的了。 <BR> <BR>点击可放大</P>. F; G2 G6 ]/ K* P$ K; y2 m( M
    <>Jaxp支持W3C所推荐的DOM 2。如果你对DOM很熟悉,那么下面的内容就很简单了:只需要按照DOM的规范来进行方法调用就可以。当然,如果你对DOM不清楚,也不用着急,后面我们会有详细的介绍。在这儿,你所要知道并牢记的是:DOM是用来描叙XML文档中的数据的模型,引入DOM的全部原因就是为了用这个模型来操作XML文档的中的数据。DOM规范中定义有节点(即对象)、属性和方法,我们通过这些节点的存取来存取XML的数据。 </P>
    ) \0 f4 q/ X+ T$ w! E* P<>从上面得到的Document对象开始,我们就可以开始我们的DOM之旅了。使用Document对象的getElementsByTagName()方法,我们可以得到一个NodeList对象,一个Node对象代表了一个XML文档中的一个标签元素,而NodeList对象,观其名而知其意,所代表的是一个Node对象的列表: <BR>NodeList nl = doc.getElementsByTagName("message");</P>
    3 b1 B. `( }& Q# D& H<>我们通过这样一条语句所得到的是XML文档中所有&lt;message&gt;标签对应的Node对象的一个列表。然后,我们可以使用NodeList对象的item()方法来得到列表中的每一个Node对象: <BR>Node my_node = nl.item(0);</P>3 r( X) g! o0 W- Y' W# @
    <>当一个Node对象被建立之后,保存在XML文档中的数据就被提取出来并封装在这个Node中了。在这个例子中,要提取Message标签内的内容,我们通常会使用Node对象的getNodeValue()方法: <BR>String message = my_node.getFirstChild().getNodeValue();</P>
    - J6 T( b9 ?7 R, G<>请注意,这里还使用了一个getFirstChild()方法来获得message下面的第一个子Node对象。虽然在message标签下面除了文本外并没有其它子标签或者属性,但是我们坚持在这里使用getFirseChild()方法,这主要和W3C对DOM的定义有关。W3C把标签内的文本部分也定义成一个Node,所以先要得到代表文本的那个Node,我们才能够使用getNodeValue()来获取文本的内容。 </P>/ a% d9 K1 V) y* K) r& \) J
    <>现在,既然我们已经能够从XML文件中提取出数据了,我们就可以把这些数据用在合适的地方,来构筑应用程序。 </P>+ B. H) M& L( r5 K. C
    <>下面的内容,我们将更多的关注DOM,为DOM作一个较为详细的解析,使我们使用起来更为得心应手。 </P>
    9 ^6 b1 |% O* x% e" _* u<>DOM详解 <BR>1.基本的DOM对象</P>2 {) I& P3 s- G8 a
    <>DOM的基本对象有5个:Document,Node,NodeList,Element和Attr。下面就这些对象的功能和实现的方法作一个大致的介绍。 <BR> <BR>点击可放大</P>
    , V9 ^1 z3 W+ U9 ?4 ^+ R<>Document对象代表了整个XML的文档,所有其它的Node,都以一定的顺序包含在Document对象之内,排列成一个树形的结构,程序员可以通过遍历这颗树来得到XML文档的所有的内容,这也是对XML文档操作的起点。我们总是先通过解析XML源文件而得到一个Document对象,然后再来执行后续的操作。此外,Document还包含了创建其它节点的方法,比如createAttribut()用来创建一个Attr对象。它所包含的主要的方法有: </P>
    4 B1 b6 l  p7 L6 b* m<>createAttribute(String):用给定的属性名创建一个Attr对象,并可在其后使用setAttributeNode方法来放置在某一个Element对象上面。 </P>
    . H) ]+ K: G1 ^6 [- `; t9 y, C' `<>createElement(String):用给定的标签名创建一个Element对象,代表XML文档中的一个标签,然后就可以在这个Element对象上添加属性或进行其它的操作。 </P>
    8 ]: j2 c7 m0 y* C<>createTextNode(String):用给定的字符串创建一个Text对象,Text对象代表了标签或者属性中所包含的纯文本字符串。如果在一个标签内没有其它的标签,那么标签内的文本所代表的Text对象是这个Element对象的唯一子对象。 </P>' ^( H( v. t2 j( m" e" O# {: l2 r, {' E
    <>getElementsByTagName(String):返回一个NodeList对象,它包含了所有给定标签名字的标签。 </P>
    7 R- J% W$ |. f; P5 i, y/ D<>getDocumentElement():返回一个代表这个DOM树的根节点的Element对象,也就是代表XML文档根元素的那个对象。 </P>
    % x! ~3 b( s3 }7 Z1 A<>Node对象是DOM结构中最为基本的对象,代表了文档树中的一个抽象的节点。在实际使用的时候,很少会真正的用到Node这个对象,而是用到诸如Element、Attr、Text等Node对象的子对象来操作文档。Node对象为这些对象提供了一个抽象的、公共的根。虽然在Node对象中定义了对其子节点进行存取的方法,但是有一些Node子对象,比如Text对象,它并不存在子节点,这一点是要注意的。Node对象所包含的主要的方法有: </P>
    3 |$ @/ D4 j7 f- k# s; ]5 f<>appendChild(org.w3c.dom.Node):为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去。 </P>
    ) V5 |0 V( t' E( I<>getFirstChild():如果节点存在子节点,则返回第一个子节点,对等的,还有getLastChild()方法返回最后一个子节点。 </P>. g5 x" x% m: x7 O: P4 n2 M, @% l7 L
    <>getNextSibling():返回在DOM树中这个节点的下一个兄弟节点,对等的,还有getPreviousSibling()方法返回其前一个兄弟节点。 </P>" a* U0 u" k) u0 H
    <>getNodeName():根据节点的类型返回节点的名称。 </P>1 `6 P( {. e% P
    <>getNodeType():返回节点的类型。 </P>
    % W. b4 L  X! i- A% N<P>getNodeValue():返回节点的值。 </P>
    $ y1 |: `" @! N; M& S$ F' z<P>hasChildNodes():判断是不是存在有子节点。 </P>
    3 s3 |& ~( f) g5 B' \( Z6 J1 \<P>hasAttributes():判断这个节点是否存在有属性。 </P>
    6 j: A1 d2 `# ?. t  I8 q% W<P>getOwnerDocument():返回节点所处的Document对象。 </P>
    ! T) h& T9 S! v$ d5 S<P>insertBefore(org.w3c.dom.Node new,org.w3c.dom.Node ref):在给定的一个子对象前再插入一个子对象。 </P>" W& ]0 `$ t' @
    <P>removeChild(org.w3c.dom.Node):删除给定的子节点对象。 </P>
    7 \8 x( g; b* ^% M" C' C! R<P>replaceChild(org.w3c.dom.Node new,org.w3c.dom.Node old):用一个新的Node对象代替给定的子节点对象。 </P>: s- m( h. x) y8 N, C( ^
    <P>NodeList对象,顾名思义,就是代表了一个包含了一个或者多个Node的列表。可以简单的把它看成一个Node的数组,我们可以通过方法来获得列表中的元素: </P>  z( o6 H' J4 u& R: X. J
    <P>GetLength():返回列表的长度。 </P>8 ]4 k: X0 V2 S9 l
    <P>Item(int):返回指定位置的Node对象。 </P>
    9 ^4 F5 D# a" M# ~' U<P>Element对象代表的是XML文档中的标签元素,继承于Node,亦是Node的最主要的子对象。在标签中可以包含有属性,因而Element对象中有存取其属性的方法,而任何Node中定义的方法,也可以用在Element对象上面。 </P>( ^5 z0 e0 }: W6 Q4 X. p
    <P>getElementsByTagName(String):返回一个NodeList对象,它包含了在这个标签中其下的子孙节点中具有给定标签名字的标签。 </P>+ Q$ K' H) |& k" [7 T
    <P>getTagName():返回一个代表这个标签名字的字符串。 </P>
    3 s  z& s/ P1 c- L5 {' r<P>getAttribute(String):返回标签中给定属性名称的属性的值。在这儿需要主要的是,应为XML文档中允许有实体属性出现,而这个方法对这些实体属性并不适用。这时候需要用到getAttributeNodes()方法来得到一个Attr对象来进行进一步的操作。 </P>* d; X7 j! H3 N7 s5 b
    <P>getAttributeNode(String):返回一个代表给定属性名称的Attr对象。 </P>
    . G  Y9 o7 U( `7 Q- U( t$ w<P>Attr对象代表了某个标签中的属性。Attr继承于Node,但是因为Attr实际上是包含在Element中的,它并不能被看作是Element的子对象,因而在DOM中Attr并不是DOM树的一部分,所以Node中的getparentNode(),getpreviousSibling()和getnextSibling()返回的都将是null。也就是说,Attr其实是被看作包含它的Element对象的一部分,它并不作为DOM树中单独的一个节点出现。这一点在使用的时候要同其它的Node子对象相区别。 </P>3 }- X- t: f: [5 s: S) U
    <P>需要说明的是,上面所说的DOM对象在DOM中都是用接口定义的,在定义的时候使用的是与具体语言无关的IDL语言来定义的。因而,DOM其实可以在任何面向对象的语言中实现,只要它实现了DOM所定义的接口和功能就可以了。同时,有些方法在DOM中并没有定义,是用IDL的属性来表达的,当被映射到具体的语言时,这些属性被映射为相应的方法。 <BR>2.DOM实例</P>
    " F: S. _* _8 v1 Z8 z<P>有了上面的介绍,相信你对DOM理解的更多了吧。下面的例子将让你对DOM更加熟悉起来。 </P>
    8 K9 H4 J" n  `<P>先说说这个例子到底要做的是什么吧,我们希望在一个名为link.xml文件中保存了一些URL地址,通过一个简单的程序,我们可以通过DOM把这些URL读出并显示出来,也可以反过来向这个XML文件中写入加入的URL地址。很简单,却很实用,也足够来例示DOM的绝大部分用法了。 </P>% d, a( l% e, a, r6 G2 M
    <P>XML文件本身不复杂,就不给出它的DTD了。link.xml: <BR>&lt;?xml version="1.0" standalone="yes"?&gt;&lt;links&gt;&lt;link&gt;&lt;text&gt;JSP Insider&lt;/text&gt;&lt;url newWindow="no"&gt;http://www.jspinsider.com&lt;/url&gt;&lt;author&gt;JSP Insider&lt;/author&gt;&lt;date&gt;&lt;day&gt;2&lt;/day&gt;&lt;month&gt;1&lt;/month&gt;&lt;year&gt;2001&lt;/year&gt;&lt;/date&gt;&lt;description&gt;A JSP information site.&lt;/description&gt;&lt;/link&gt;&lt;link&gt;&lt;text&gt;The makers of Java&lt;/text&gt;&lt;url newWindow="no"&gt;http://java.sun.com&lt;/url&gt;&lt;author&gt;Sun Microsystems&lt;/author&gt;&lt;date&gt;&lt;day&gt;3&lt;/day&gt;&lt;month&gt;1&lt;/month&gt;&lt;year&gt;2001&lt;/year&gt;&lt;/date&gt;&lt;description&gt;Sun Microsystem's website.&lt;/description&gt;&lt;/link&gt;&lt;link&gt;&lt;text&gt;The standard JSP container&lt;/text&gt;&lt;url newWindow="no"&gt;http://jakarta.apache.org&lt;/url&gt;&lt;author&gt;Apache Group&lt;/author&gt;&lt;date&gt;&lt;day&gt;4&lt;/day&gt;&lt;month&gt;1&lt;/month&gt;&lt;year&gt;2001&lt;/year&gt;&lt;/date&gt;&lt;description&gt;Some great software.&lt;/description&gt;&lt;/link&gt;&lt;/links&gt;</P>
    5 h' y3 e4 @) G8 T1 a# o# r<P>第一个程序我们称为xmldisplay.java,具体的程序清单可以在附件中找到。主要的功能就是读取这个XML文件中各个节点的内容,然后在格式化输出在System.out上,我们来看看这个程序: <BR>import javax.xml.parsers.*;import org.w3c.dom.*;</P>2 {( l/ R* A) S" C" c# n' F$ t
    <P>这是引入必要的类,因为在这里使用的是Sun所提供的XML解析器,因而需要引入java.xml.parsers包,其中包含了有DOM解析器和SAX解析器的具体实现。org.w3c.dom包中定义了w3c所制定的DOM接口。 <BR>DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document doc=builder.parse("links.xml");doc.normalize();<BR>除了上面讲到的,还有一个小技巧,对Document对象调用normalize(),可以去掉XML文档中作为格式化内容的空白而映射在DOM树中的不必要的Text Node对象。否则你得到的DOM树可能并不如你所想象的那样。特别是在输出的时候,这个normalize()更为有用。 <BR>NodeList links =doc.getElementsByTagName("link");</P>
    7 m/ N/ M+ T" H1 i4 r; ~. W<P>刚才说过,XML文档中的空白符也会被作为对象映射在DOM树中。因而,直接调用Node方法的getChildNodes方法有时候会有些问题,有时不能够返回所期望的NodeList对象。解决的办法是使用Element的getElementByTagName(String),返回的NodeLise就是所期待的对象了。然后,可以用item()方法提取想要的元素。 <BR>for (int i=0;i&lt;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();}</P>  e% G4 E6 n6 d: r; _9 b4 }2 E
    <P>上面的代码片断就完成了对XML文档内容的格式化输出。只要注意到一些细节的问题,比如getFirstChile()方法和getElementsByTagName()方法的使用,这些还是比较容易的。 </P>5 l, V" Q  `' p3 d& t
    <P>下面的内容,就是在修改了DOM树后重新写入到XML文档中去的问题了。这个程序名为xmlwrite.java。在JAXP1.0版本中,并没有直接的类和方法能够处理XML文档的写入问题,需要借助其它包中的一些辅助类。而在JAXP1.1版本中,引入了对XSLT的支持,所谓XSLT,就是对XML文档进行变换(Translation)后,得到一个新的文档结构。利用这个新加入的功能,我们就能够很方便的把新生成或者修改后的DOM树从新写回到XML文件中去了,下面我们来看看代码的实现,这段代码的主要功能是向links.xml文件中加入一个新的link节点: <BR>import javax.xml.parsers.*;import javax.xml.transform.*;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.*;</P>
    * |# s! T2 B7 F0 V<P>新引入的java.xml.transform包中的几个类,就是用来处理XSLT变换的。 </P>( ]( |! U4 u+ I: _0 i$ P, R
    <P>我们希望在上面的XML文件中加入一个新的link节点,因而首先还是要读入links.xml文件,构建一个DOM树,然后再对这个DOM树进行修改(添加节点),最后把修改后的DOM写回到links.xml文件中: <BR>DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document doc=builder.parse("links.xml");doc.normalize();//---取得变量----String text="Hanzhong's Homepage";String url="<a href='http://www.hzliu.com";String' target="_blank" >www.hzliu.com";String</A> author="Hzliu Liu";String discription="A site from Hanzhong Liu, give u lots of suprise!!!";</P>
    % K7 V# @' Q( z/ d7 _( Y3 U<P>为了看清重点,简化程序,我们把要加入的内容硬编码到记忆String对象中,而实际操作中,往往利用一个界面来提取用户输入,或者通过JDBC从数据库中提取想要的内容。 <BR>Text textseg;Element link=doc.createElement("link");</P>
    1 f; o  Y3 S4 O, h<P>首先应该明了的是,无论什么类型的Node,Text型的也好,Attr型的也好,Element型的也好,它们的创建都是通过Document对象中的createXXX()方法来创建的(XXX代表具体要创建的类型),因此,我们要向XML文档中添加一个link项目,首先要创建一个link对象: <BR>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);</P>) d9 y6 w* h: e, J: a7 C% g4 r+ j. x
    <P>创建节点的过程可能有些千篇一律,但需要注意的地方是,对Element中所包含的text(在DOM中,这些text也是代表了一个Node的,因此也必须为它们创建相应的node),不能直接用Element对象的setNodeValue()方法来设置这些text的内容,而需要用创建的Text对象的setNodeValue()方法来设置文本,这样才能够把创建的Element和其文本内容添加到DOM树中。看看前面的代码,你会更好的理解这一点: <BR>doc.getDocumentElement().appendChild(link);</P>5 N) @) U5 ?) _& J
    <P>最后,不要忘记把创建好的节点添加到DOM树中。Document类的getDocumentElement()方法,返回代表文档根节点的Element对象。在XML文档中,根节点一定是唯一的。 <BR>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);</P>4 `4 s5 _4 {/ ]  G4 X$ R# k& d
    <P>然后就是用XSLT把DOM树输出了。这里的TransformerFactory也同样应用了工厂模式,使得具体的代码同具体的变换器无关。实现的方法和DocumentBuilderFactory相同,这儿就不赘述了。Transformer类的transfrom方法接受两个参数、一个数据源Source和一个输出目标Result。这里分别使用的是DOMSource和StreamResult,这样就能够把DOM的内容输出到一个输出流中,当这个输出流是一个文件的时候,DOM的内容就被写入到文件中去了。<BR><BR></P>
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-10 03:05 , Processed in 0.403729 second(s), 90 queries .

    回顶部