??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品日韩在线观看,青青草娱乐在线,9999在线视频http://www.aygfsteel.com/vso/category/16172.htmlJAVA EEzh-cnWed, 28 Feb 2007 03:57:05 GMTWed, 28 Feb 2007 03:57:05 GMT60用JDOM包实现生成XML文g的简单示?/title><link>http://www.aygfsteel.com/vso/articles/74813.html</link><dc:creator>vso</dc:creator><author>vso</author><pubDate>Thu, 12 Oct 2006 08:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/vso/articles/74813.html</guid><wfw:comment>http://www.aygfsteel.com/vso/comments/74813.html</wfw:comment><comments>http://www.aygfsteel.com/vso/articles/74813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/vso/comments/commentRss/74813.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/vso/services/trackbacks/74813.html</trackback:ping><description><![CDATA[ <blockquote> <font color="#000000" size="4">CODE: <hr /></font> <pre> <font color="#000000" size="4"> <br />import java.io.*;<br />import org.jdom.*;<br />import org.jdom.input.*;<br />import org.jdom.input.*;<br />import org.jdom.output.*;<br /><br />public class test1 {<br />    public void BuildXMLDoc() throws IOException, JDOMException {<br />        Element eeeRoot, eee1, eee2;<br />        Document Doc;<br />        eeeRoot = new Element("employees_information");<br />        Doc = new Document(eeeRoot);<br />        eeeRoot = Doc.getRootElement();<br /><br />        eee1 = new Element("name");<br />        eee2 = eee1.setText("C.Y. Shen");<br />        //eee2 = eee1.addAttribute("emp_id", "001");<br />        eee1 = eeeRoot.addContent(eee2);<br /><br />        eee1 = new Element("age");<br />        eee2 = eee1.setText("43");<br />        eee1 = eeeRoot.addContent(eee2);<br /><br />        eee1 = new Element("sex");<br />        eee2 = eee1.setText("Male");<br />        eee1 = eeeRoot.addContent(eee2);<br />        XMLOut.setEncoding("gb2312") Q XMLOutputter XMLOut = new XMLOutputter();<br />        XMLOut.output(Doc, new FileOutputStream("test1.xml"));<br />    }<br /><br />    public static void main(String[] args) {<br />        try {<br />            test1 s1 = new test1();<br />            System.out.println("Now we build an XML document .....");<br />            s1.BuildXMLDoc();<br />        } catch (Exception e) {<br />            System.out.println(e.getMessage());<br />        }<br />    }<br />}<br /></font> </pre> <font color="#000000" size="4"> <hr /> </font> </blockquote> <br /> <br />输出如下Q?br /><?xml version="1.0" encoding="gb2312" ?> <br />- <employees_information> <br /><record><br /><name>C.Y. Shen</name> <br /><age>43</age> <br /><sex>Male</sex> <br /></employees_information><img src ="http://www.aygfsteel.com/vso/aggbug/74813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/vso/" target="_blank">vso</a> 2006-10-12 16:55 <a href="http://www.aygfsteel.com/vso/articles/74813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过XSLT讉KJava代码[转]http://www.aygfsteel.com/vso/articles/74812.htmlvsovsoThu, 12 Oct 2006 08:53:00 GMThttp://www.aygfsteel.com/vso/articles/74812.htmlhttp://www.aygfsteel.com/vso/comments/74812.htmlhttp://www.aygfsteel.com/vso/articles/74812.html#Feedback0http://www.aygfsteel.com/vso/comments/commentRss/74812.htmlhttp://www.aygfsteel.com/vso/services/trackbacks/74812.html我看到过利用cMVBScript和Jscript的脚本语a完成Ҏ处理的例子(针对微Y解析器的Q,但是如何利用Java来执行特D的处理q不是特别地明显。尽如此,单地_可以在XSLT处理器中通过XML命名I间QnamespacesQ调用Java函数来实现。Java与XSLT的结合ؓ构徏健壮的应用程序提供了强有力的Ҏ?br />使用定制的命名空?br />命名I间是通过使用l一资源标识W?URI)来修饰限定XSL中元素和属性名U的一U方法。例如,常见的XSL元素需要有xsl命名I间前缀来修饎ͼxsl通过使用XSLT命名I间URI来声明:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
但是q不局限于使用XSLT命名I间Q你完全可以自由地声明你自己定制的命名空_q用它们来识别定制的XSLT标签和范围?br />你必M用定制的命名I间前缀来完成对外部函数的调用,例如Qmynspace:fundtion()Q该命名I间前缀mynspaceQ必M一个命名空间URI相关联,例如Q?br />xmlns:myspace="d:///XMLprogs/mynamespace" 
一般的Javal定使用命名I间URI标识Javacd数的位置。对用于本文CZ代码的Xalan XSLT处理器(版本1.2.2Q来_命名I间URI必须hURI-stem/packagename的Ş式。如果你使用了XTQ那么你的命名空间应该有如下格式Q?br />xmlns:mynspace="d://XMLprogs/mynamespace.myclassname 
q种情况下,你可以用XSLT代码调用来自myclassname的Java函数?br />l定外部Java函数
此处l出在XSLT模板内部l定Java语言~写的外部函数的q程?br />你自己定制的命名空间作为它们的属性添加到样式表(stylesheetQ元素或者你的模板中?br />保你的JavacL件所在目录位于你的XSLT处理器所q行的Java虚拟机(JVMQ的CLASSPATH中?br />对于静态方法,可以使可以用完全合格的类名称加上Ҏ和Q何必需的的参数Q当然还有命名空间前~?br />对于非静态方法,首先创徏cd例,然后调用该方法ƈ提供M必需的参数?br />例如Q下面的样式表元素包含一个定制的命名I间声明Q?br />
CODE:

<?xml version=?.0” encoding=”UTF-8?>
<xsl:stylesheet version=?.0” xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” xmlns:myspace=”d://XMLprogs/mynamespace?gt; 


在声明了q个命名I间后,可以讉K该类的Q何静态方法,像这P
CODE:

<xsl:variable name=”funvalue”select=”mynspace:classname.function()?> 


如果Ҏ不是静态的Q那么必首先调用类构造器Q例如:
CODE:

<xsl:variable name="funvalue" select="mynspace.classname.new()"/>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="d://XMLprogs/mynamespace" exclude-result-prefixes="java"> 


Java包\"mynamespace"必须位于"d://XMLprogs"目录中?br />注意Q用可选属性xsl:exclude-result-prefixesQ预防了java命名I间被包括到l果文中?br />
CODE:

<xsl:template match="/">
<html>
<body>
<p>
<xsl:value-of select="java:DateClass.displayDate()"/>
</p>
</body>
</html>
</xsl:template> 


上面的XSLT代码中,<xsl:value-of select="java:DateClass.displayDate()"/>行调用位于mynamespace包中名ؓDateClass的类的静态方法displayDate()?br />利用q种技术,你可以调用Q何JavacL法——包括那些需要参数的Ҏ——参数来自于你的XSLT模板?br />本文涉及的代码:date.xsl
CODE:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:java="d://XMLprogs/mynamespace" exclude-result-prefixes="java">
<xsl:template match="/">
<html>
<body>
<p>
<xsl:value-ofselect="java:DateClass.displayDate()" />
</p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
DateClass.java
packagemynamespace;
importjava.util.Date;
public class DateClass{
public static String displayDate(){
Date d = new Date();
returnd.toString();
}



要运行这些代码,需要:
创徏文g?d:XMLProgsmynamespace"?br />DateClass.java文g攑օ上述路径q编译得到DateClass.class文g?br />?d:XMLProgsmynamespace"攑օclasspath变量中?br />利用XSLT处理器,例如XT或XALAN该XSL文g和具体的XML文g兌。?img src ="http://www.aygfsteel.com/vso/aggbug/74812.html" width = "1" height = "1" />

vso 2006-10-12 16:53 发表评论
]]>
Java与XML联合~程之SAX?/title><link>http://www.aygfsteel.com/vso/articles/74811.html</link><dc:creator>vso</dc:creator><author>vso</author><pubDate>Thu, 12 Oct 2006 08:51:00 GMT</pubDate><guid>http://www.aygfsteel.com/vso/articles/74811.html</guid><wfw:comment>http://www.aygfsteel.com/vso/comments/74811.html</wfw:comment><comments>http://www.aygfsteel.com/vso/articles/74811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/vso/comments/commentRss/74811.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/vso/services/trackbacks/74811.html</trackback:ping><description><![CDATA[SAX概念 <br />SAX是Simple API for XML的羃写,它ƈ不是由W3C官方所提出的标准,可以说是“民间”的事实标准。实际上Q它是一U社区性质的讨Z物。虽然如此,在XML中对SAX的应用丝毫不比DOM,几乎所有的XML解析器都会支持它。?br /><br />与DOM比较而言QSAX是一U轻量型的方法。我们知道,在处理DOM的时候,我们需要读入整个的XML文Q然后在内存中创建DOM树,生成DOM树上的每个Node对象。当文比较的时候,q不会造成什么问题,但是一旦文大hQ处理DOM׃变得相当Ҏ费力。特别是其对于内存的需求,也将是成倍的增长Q以至于在某些应用中使用DOM是一件很不划的事(比如在applet中)。这时候,一个较好的替代解决Ҏ是SAX。?br /><br />SAX在概念上与DOM完全不同。首先,不同于DOM的文驱动,它是事g驱动的,也就是说Q它q不需要读入整个文档,而文的dq程也就是SAX的解析过E。所谓事仉动,是指一U基于回调(callbackQ机制的E序q行Ҏ。(如果你对Java新的代理事g模型比较清楚的话Q就会很Ҏ理解q种机制了) <br /><br /><a target="_blank"><img title="open in new window" alt="" src="http://www0.ccidnet.com/tech/guide/2001/10/08/image/image006.gif" border="0" /></a><br />在XMLReader接受XML文Q在dXML文的过E中p行解析,也就是说d文档的过E和解析的过E是同时q行的,q和DOM区别很大。解析开始之前,需要向XMLReader注册一个ContentHandlerQ也是相当于一个事件监听器Q在ContentHandler中定义了很多ҎQ比如startDocument()Q它定制了当在解析过E中Q遇到文档开始时应该处理的事情。当XMLReaderd合适的内容Q就会抛出相应的事gQƈ把这个事件的处理权代理给ContentHandlerQ调用其相应的方法进行响应。?br /><br />q样泛泛的说来或许有些不Ҏ理解Q别急,后面的例子会让你明白SAX的解析过E。看看这个简单XML文gQ?br /><br /><POEM><br /><AUTHOR>Ogden Nash</AUTHOR><br /><TITLE>Fleas</TITLE><br /><LINE>Adam</LINE><br /></POEM> <br /><br />当XMLReaderd<POEM>标签Ӟ׃调用ContentHandler.startElement()ҎQƈ把标{֐POEM作ؓ参数传递过厅R在你实现的startElement()Ҏ中需要做相应的动作,以处理当<POEM>出现时应该做的事情。各个事仉着解析的过E(也就是文读入的q程Q一个个序的被抛出Q相应的Ҏ也会被顺序的调用Q最后,当解析完成,Ҏ都被调用后,Ҏ的处理也就完成了。下面的q个表,列出了在解析上面的那个XML文g的时候,序被调用的ҎQ?br /><br /><a target="_blank"><img title="open in new window" alt="" src="http://download.cnjsp.org/images/cnjsp_doc_image_20031219_02.gif" border="0" /></a><br />ContentHandler实际上是一个接口,当处理特定的XML文g的时候,需要ؓ其创Z个实CContentHandler的类来处理特定的事gQ可以说Q这个实际上是SAX处理XML文g的核心。下面我们来看看定义在其中的一些方法: <br /><br />void characters(char[] ch, int start, int length)Q?br /><br />q个Ҏ用来处理在XML文g中读到字W串Q它的参数是一个字W数l,以及d的这个字W串在这个数l中的v始位|和长度Q我们可以很Ҏ的用Stringcȝ一个构造方法来获得q个字符串的Stringc:String charEncontered=new String(ch,start,length)。?br /><br />void startDocument()Q?br /><br />当遇到文档的开头的时候,调用q个ҎQ可以在其中做一些预处理的工作。?br /><br />void endDocument()Q?br /><br />和上面的Ҏ相对应,当文结束的时候,调用q个ҎQ可以在其中做一些善后的工作。?br /><br />void startElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String qName, Attributes atts) <br /><br />当读C个开始标{时候,会触发这个方法。在SAX1.0版本中ƈ不支持名域,而在新的2.0版本中提供了对名域的支持Q这儿参C的namespaceURI是名域QlocalName是标{֐QqName是标{修饰前缀Q当没有使用名域的时候,q两个参数都未null。而atts是这个标{所包含的属性列表。通过attsQ可以得到所有的属性名和相应的倹{要注意的是SAX中一个重要的特点是它的式处理Q在遇到一个标{时候,它ƈ不会U录下以前所到的标{,也就是说Q在startElement()Ҏ中,所有你所知道的信息,是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属{等其它与结构相关的信息Q都是不得而知的,都需要你的程序来完成。这使得SAX在编E处理上没有DOM来得那么方便。?br /><br />void endElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String qName) <br /><br />q个Ҏ和上面的Ҏ相对应,在遇到结束标{时候,调用q个Ҏ。?br /><br />因ؓContentHandler是一个接口,在用的时候可能会有些不方便,因而,SAX中还为其制定了一个Helperc:DefaultHandlerQ它实现了这个接口,但是其所有的Ҏ体都为空Q在实现的时候,你只需要承这个类Q然后重载相应的Ҏ卛_。?br /><br />OKQ到q儿SAX的基本知识已l差不多讲完了,下面我们来看看两个具体的例子Q以更好的理解SAX地用法。?br /><br />SAX~程实例 <br />我们q是沿用讲DOM的时候用的那个文例子Q但首先Q我们先看一个简单一些的应用Q我们希望能够统计一下XML文g中各个标{և现的ơ数。这个例子很单,但是以阐述SAX~程的基本思\了。?br /><br />一开始当然还是import语句了: <br /><br />import org.xml.sax.helpers.DefaultHandler;<br />import javax.xml.parsers.*;<br />import org.xml.sax.*;<br />import org.xml.sax.helpers.*;<br />import java.util.*;<br />import java.io.*; <br /><br />然后Q我们创Z个承于DefaultHandler的类Q具体的E序逻辑在这儿可以暂且放在一边,要注意的是程序的l构Q?br /><br />public class SAXCounter extends DefaultHandler {<br />private Hashtable tags; //q个Hashtable用来记录tag出现的次?br />// 处理文前的工作\<br />public void startDocument() throws SAXException {<br />tags = new Hashtable();//初始化Hashtable<br />}<br />//Ҏ一个开始元属进行处理\<br />public void startElement(String namespaceURI, String localName,<br />String rawName, Attributes atts)<br />throws SAXException<br />{<br />String key = localName;<br />Object value = tags.get(key);<br />if (value == null) {<br />// 如果是新到的标{,q在Hastable中添加一条记?br />tags.put(key, new Integer(1));<br />} else {<br />// 如果以前到q,得到其计数|q加1<br />int count = ((Integer)value).intValue();<br />count++;<br />tags.put(key, new Integer(count));<br />}<br />}<br />//解析完成后的l计工作\<br />public void endDocument() throws SAXException {<br />Enumeration e = tags.keys();<br />while (e.hasMoreElements()) {<br />String tag = (String)e.nextElement();<br />int count = ((Integer)tags.get(tag)).intValue();<br />System.out.println("Tag <" + tag + "> occurs " + count<br />+ " times");<br />}<br />}<br />//E序入口Q用来完成解析工作\<br />static public void main(String[] args) {<br />String filename = null;<br />boolean validation = false;<br />filename="links.xml";<br />SAXParserFactory spf = SAXParserFactory.newInstance();<br />XMLReader xmlReader = null;<br />SAXParser saxParser=null;<br />try {<br />// 创徏一个解析器SAXParser对象\<br />saxParser = spf.newSAXParser();<br />// 得到SAXParser中封装的SAX XMLReader<br />xmlReader = saxParser.getXMLReader();<br />} catch (Exception ex) {<br />System.err.println(ex);<br />System.exit(1);<br />}<br />try {<br />//使用指定的ContentHandlerQ解析给XML文gQ这儿要注意的是Qؓ?br />//E序的简单v见,q儿主E序和ContentHandler攑֜了一赗实际上<br />//mainҎ中所作的所有事情,都与ContentHandler无关?br />xmlReader.parse(new File(filename),new SAXCounter());<br />} catch (SAXException se) {<br />System.err.println(se.getMessage());<br />System.exit(1);<br />} catch (IOException ioe) {<br />System.err.println(ioe);<br />System.exit(1);<br />}<br />}<br />} <br /><br />我们来看看这D늨序作了些什么,在main()Ҏ中,主要做的是创徏解析器,然后解析文。实际上Q在q儿创徏SAXParser对象的时候,Z使程序代码于具体的解析器无关Q用了同DOM中一L设计技巧:通过一个SAXParserFactorycL创徏具体的SAXParser对象Q这P当需要用不同的解析器的时候,要改变的Q只是一个环境变量的|而程序的代码可以保持不变。这是FactoryMethod模式的思想。在q儿不再具体讲了Q如果还有不明白的,可以参看上面DOM中的解释Q原理是一L。?br /><br />不过在这儿还有一点点要注意的地方Q就是SAXParsercdXMLReadercM间的关系。你可能有些qL了吧Q实际上SAXParser是JAXP中对XMLReader的一个封装类Q而XMLReader是定义在SAX2.0U的一个用来解析文档的接口。你可以同样的调用SAXParser或者XMLReader中的parser()Ҏ来解析文档,效果是完全一L。不q在SAXParser中的parser()Ҏ接受更多的参敎ͼ可以对不同的XML文档数据源进行解析,因而用v来要比XMLReader要方便一些。?br /><br />q个例子仅仅涉及了SAX的一点皮毛,而下面的q个Q可p高一些了。下面我们要实现的功能,在DOM的例子中已经有实CQ就是从XML文档中读出内容ƈ格式化输出,虽然E序逻辑看v来还是很单,但是SAX可不比DOM哦,看着吧。?br /><br />前面说过Q当遇到一个开始标{时候,在startElement()Ҏ中,我们q不能够得到q个标签在XML文中所处的位置。这在处理XML文的时候是个大ȝQ因为在XML中标{语义Q有一部分是由其所处的位置所军_的。而且在一些需要验证文结构的E序中,q更是一个问题。当Ӟ没有解决不了的问题了Q我们可以用一个栈来实现对文l构的纪录。?br /><br />栈的特点是先q先出,我们现在的想法是Q在startElemnt()Ҏ中用push这个标{名字d到栈中,在endElement()Ҏ中在把它pop出来。我们知道对一个结构良好的XML而言Q其嵌套l构是完备的Q每一个开始标{M对应一个结束标{,而且不会出现标签嵌套之间的错位。因而,每一ơstartElement()Ҏ的调用,必然会对应一个endElement()Ҏ的调用,q样push和pop也是成对出现的,我们只需要分析栈的结构,可以很Ҏ的知道当前标{所处在文档l构中的位置了。?br /><br />public class SAXReader extends DefaultHandler {<br />java.util.Stack tags=new java.util.Stack();<br />//--------------XML Content-------------<br />String text=null;<br />String url=null;<br />String author=null;<br />String description=null;<br />String day=null;<br />String year=null;<br />String month=null;<br />//----------------------------------------------<br />public void endDocument() throws SAXException {<br />System.out.println("------Parse End--------");<br />}<br />public void startDocument() throws SAXException {<br />System.out.println("------Parse Begin--------");<br />}<br />public void startElement(String p0, String p1, String p2, Attributes p3) throws SAXException {<br />tags.push(p1);<br />}<br />public void endElement(String p0, String p1, String p2) throws SAXException {<br />tags.pop();<br />//一个link节点的信息收集齐了,其格式化输出\<br />if (p1.equals("link")) printout();<br />}<br />public void characters(char[] p0, int p1, int p2) throws SAXException {<br />//从栈中得到当前节点的信息<br />String tag=(String) tags.peek();<br />if (tag.equals("text")) text=new String(p0,p1,p2);<br />else if (tag.equals("url")) url=new String(p0,p1,p2);<br />else if (tag.equals("author")) author=new String(p0,p1,p2);<br />else if (tag.equals("day")) day=new String(p0,p1,p2);<br />else if (tag.equals("month")) month=new String(p0,p1,p2);<br />else if (tag.equals("year")) year=new String(p0,p1,p2);<br />else if (tag.equals("description")) year=new String(p0,p1,p2);<br />}<br />private void printout(){<br />System.out.print("Content: ");<br />System.out.println(text);<br />System.out.print("URL: ");<br />System.out.println(url);<br />System.out.print("Author: ");<br />System.out.println(author);<br />System.out.print("Date: ");<br />System.out.println(day+"-"+month+"-"+year);<br />System.out.print("Description: ");<br />System.out.println(description);<br />System.out.println();<br />}<br />static public void main(String[] args) {<br />String filename = null;<br />boolean validation = false;<br />filename="links.xml";<br />SAXParserFactory spf = SAXParserFactory.newInstance();<br />SAXParser saxParser=null;<br />try {<br />saxParser = spf.newSAXParser();<br />} catch (Exception ex) {<br />System.err.println(ex);<br />System.exit(1);<br />}<br />try {<br />saxParser.parse(new File(filename),new SAXReader());<br />} catch (SAXException se) {<br />System.err.println(se.getMessage());<br />System.exit(1);<br />} catch (IOException ioe) {<br />System.err.println(ioe);<br />System.exit(1);<br />}<br />}<br />} <br /><br />在这儿虽然没有用到栈的分析Q但实际上栈的分析是一件很Ҏ的事情,应ؓjava.util.Stackl承了java.util.Vectorc,而且Stack中的元素是按栈的l构由底至上排列的,因个Q我们可以用Vectorcȝsize()Ҏ来得到Stack的元素个敎ͼq可以用Vector的get(int)Ҏ来得到具体的每一个元属。实际上Q如果把Stack的元素从底向上逐一排列出来Q我们就得到了从XML根节点到当前节点的一条唯一的\径,有了q条路径的信息,文档的结构就在清楚不q了。?br /><br />节 <br />好了Q到q儿为止Q我们已l掌握了对于XML~程的两大利器:DOM和SAXQ也知道了该如何在一个JavaE序中用它们。DOM~程相对单,但是速度比较慢,占用内存多,而SAX~程复杂一些,但是速度快,占用内存。所以,我们应该Ҏ不同的环境选择使用不同的方法。大部分的XML应用基本都可以用它们来解冟뀂需要特别说明的是,DOM和SAX其实都是语言无关的,qJava所独有Q也是_只要有相应的语言实现QDOM和SAX可以应用在Q何面向对象的语言中。?br /><br />上面我们介绍了XML文的读入,内容提取Q以及文档添加和修改的一些方法。还有一cȝ问题是XML文档的{换,虽然用DOM和SAX也可以解冻I但是实现h很复杂,而应用XSLT׃单许多。这个问题,W者将会在以后的文章中再和大家详细讨论<br /><img src ="http://www.aygfsteel.com/vso/aggbug/74811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/vso/" target="_blank">vso</a> 2006-10-12 16:51 <a href="http://www.aygfsteel.com/vso/articles/74811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java与XML联合~程之DOM?/title><link>http://www.aygfsteel.com/vso/articles/74810.html</link><dc:creator>vso</dc:creator><author>vso</author><pubDate>Thu, 12 Oct 2006 08:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/vso/articles/74810.html</guid><wfw:comment>http://www.aygfsteel.com/vso/comments/74810.html</wfw:comment><comments>http://www.aygfsteel.com/vso/articles/74810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/vso/comments/commentRss/74810.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/vso/services/trackbacks/74810.html</trackback:ping><description><![CDATA[ <strong>DOM初步</strong> <br /><br />DOM是Document Object Model的羃写,x档对象模型。前面说q,XML数据组lؓ一颗树Q所以DOM是对这颗树的一个对象描叙。通俗的说Q就是通过解析XML文QؓXML文在逻辑上徏立一个树模型Q树的节Ҏ一个个对象。我们通过存取q些对象p够存取XML文的内宏V?br /><br />下面我们来看一个简单的例子Q看看在DOM中,我们是如何来操作一个XML文的。?br /><br />q是一个XML文档Q也是我们要操作的对象: <br /><blockquote><font size="-1">CODE:</font><hr /><pre><br /><?xml version="1.0" encoding="UTF-8"?><br /><messages><br /><message>Good-bye serialization, hello Java!</message><br /></messages> <br /></pre><hr /></blockquote><br /><br />下面Q我们需要把q个文的内容解析到一个个的Java对象中去供程序用,利用JAXPQ我们只需几行代码p做到q一炏V首先,我们需要徏立一个解析器工厂Q以利用q个工厂来获得一个具体的解析器对象: <br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); <br /></pre><hr /></blockquote><br /><br />我们在这里用DocumentBuilderFacotry的目的是Z创徏与具体解析器无关的程序,当DocumentBuilderFactorycȝ静态方法newInstance()被调用时Q它Ҏ一个系l变量来军_具体使用哪一个解析器。又因ؓ所有的解析器都服从于JAXP所定义的接口,所以无论具体用哪一个解析器Q代码都是一L。所以当在不同的解析器之间进行切换时Q只需要更改系l变量的|而不用更改Q何代码。这是工厂所带来的好处。这个工厂模式的具体实现Q可以参看下面的cd。?br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />DocumentBuilder db = dbf.newDocumentBuilder(); <br /></pre><hr /></blockquote><br /><br />当获得一个工厂对象后Q用它的静态方法newDocumentBuilder()Ҏ可以获得一个DocumentBuilder对象Q这个对象代表了具体的DOM解析器。但具体是哪一U解析器Q微软的或者IBM的,对于E序而言q不重要。?br /><br />然后Q我们就可以利用q个解析器来对XML文q行解析了: <br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />Document doc = db.parse("c:/xml/message.xml"); <br /></pre><hr /></blockquote><br /><br />DocumentBuilder的parse()Ҏ接受一个XML文档名作入参敎ͼq回一个Document对象Q这个Document对象׃表了一个XML文的树模型。以后所有的对XML文的操作,都与解析器无养I直接在这个Document对象上进行操作就可以了。而具体对Document操作的方法,是由DOM所定义的了。?br /><a target="_blank"><img title="open in new window" alt="" src="http://www0.ccidnet.com/tech/guide/2001/10/08/image/image002.gif" border="0" /></a><br /><br />Jaxp支持W3C所推荐的DOM 2。如果你对DOM很熟悉,那么下面的内容就很简单了Q只需要按照DOM的规范来q行Ҏ调用可以。当Ӟ如果你对DOM不清楚,也不用着急,后面我们会有详细的介l。在q儿Q你所要知道ƈ牢记的是QDOM是用来描叙XML文中的数据的模型,引入DOM的全部原因就是ؓ了用q个模型来操作XML文的中的数据。DOM规范中定义有节点Q即对象Q、属性和ҎQ我们通过q些节点的存取来存取XML的数据。?br /><br />从上面得到的Document对象开始,我们可以开始我们的DOM之旅了。用Document对象的getElementsByTagName()ҎQ我们可以得C个NodeList对象Q一个Node对象代表了一个XML文中的一个标{օ素,而NodeList对象Q观其名而知其意Q所代表的是一个Node对象的列表: <br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />NodeList nl = doc.getElementsByTagName("message"); <br /></pre><hr /></blockquote><br /><br />我们通过q样一条语句所得到的是XML文档中所?lt;message>标签对应的Node对象的一个列表。然后,我们可以使用NodeList对象的item()Ҏ来得到列表中的每一个Node对象Q?br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />Node my_node = nl.item(0); <br /></pre><hr /></blockquote><br /><br />当一个Node对象被徏立之后,保存在XML文中的数据p提取出来q封装在q个Node中了。在q个例子中,要提取Message标签内的内容Q我们通常会用Node对象的getNodeValue()ҎQ?br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />String message = my_node.getFirstChild().getNodeValue(); <br /></pre><hr /></blockquote><br />h意,q里q用了一个getFirstChild()Ҏ来获得message下面的第一个子Node对象。虽然在message标签下面除了文本外ƈ没有其它子标{或者属性,但是我们坚持在这里用getFirseChild()ҎQ这主要和W3C对DOM的定义有兟뀂W3C把标{ֆ的文本部分也定义成一个NodeQ所以先要得C表文本的那个NodeQ我们才能够使用getNodeValue()来获取文本的内容。?br /><br />现在Q既然我们已l能够从XML文g中提取出数据了,我们可以把q些数据用在合适的地方Q来构筑应用E序。?br /><br />下面的内容,我们更多的xDOMQؓDOM作一个较l的解析Q我们使用h更ؓ得心应手。?br /><br /><strong>DOM详解</strong> <br />1Q基本的DOM对象 <br /><br />DOM的基本对象有5个:DocumentQNodeQNodeListQElement和Attr。下面就q些对象的功能和实现的方法作一个大致的介绍。?br /><a target="_blank"><img title="open in new window" alt="" src="http://www0.ccidnet.com/tech/guide/2001/10/08/image/image004.gif" border="0" /></a><br />Document对象代表了整个XML的文档,所有其它的NodeQ都以一定的序包含在Document对象之内Q排列成一个树形的l构Q程序员可以通过遍历q颗树来得到XML文的所有的内容Q这也是对XML文操作的v炏V我们L先通过解析XML源文件而得C个Document对象Q然后再来执行后l的操作。此外,Documentq包含了创徏其它节点的方法,比如createAttribut()用来创徏一个Attr对象。它所包含的主要的Ҏ有: <br /><br />createAttribute(String)Q用l定的属性名创徏一个Attr对象Qƈ可在其后使用setAttributeNodeҎ来放|在某一个Element对象上面。?br /><br />createElement(String)Q用l定的标{֐创徏一个Element对象Q代表XML文中的一个标{,然后可以在q个Element对象上添加属性或q行其它的操作。?br /><br />createTextNode(String)Q用l定的字W串创徏一个Text对象QText对象代表了标{或者属性中所包含的纯文本字符丌Ӏ如果在一个标{ֆ没有其它的标{,那么标签内的文本所代表的Text对象是这个Element对象的唯一子对象。?br /><br />getElementsByTagName(String)Q返回一个NodeList对象Q它包含了所有给定标{֐字的标签。?br /><br />getDocumentElement()Q返回一个代表这个DOM树的根节点的Element对象Q也是代表XML文根元素的那个对象。?br /><br />Node对象是DOMl构中最为基本的对象Q代表了文树中的一个抽象的节点。在实际使用的时候,很少会真正的用到Nodeq个对象Q而是用到诸如Element、Attr、Text{Node对象的子对象来操作文档。Node对象些对象提供了一个抽象的、公q栏V虽然在Node对象中定义了对其子节点进行存取的ҎQ但是有一些Node子对象,比如Text对象Q它q不存在子节点,q一Ҏ要注意的。Node对象所包含的主要的Ҏ有: <br /><br />appendChild(org.w3c.dom.Node)Qؓq个节点d一个子节点Qƈ攑֜所有子节点的最后,如果q个子节点已l存在,则先把它删掉再添加进厅R?br /><br />getFirstChild()Q如果节点存在子节点Q则q回W一个子节点Q对{的Q还有getLastChild()Ҏq回最后一个子节点。?br /><br />getNextSibling()Q返回在DOM树中q个节点的下一个兄弟节点,对等的,q有getPreviousSibling()Ҏq回其前一个兄弟节炏V?br /><br />getNodeName()Q根据节点的cdq回节点的名U。?br /><br />getNodeType()Q返回节点的cd。?br /><br />getNodeValue()Q返回节点的倹{?br /><br />hasChildNodes()Q判断是不是存在有子节点。?br /><br />hasAttributes()Q判断这个节Ҏ否存在有属性。?br /><br />getOwnerDocument()Q返回节Ҏ处的Document对象。?br /><br />insertBefore(org.w3c.dom.Node newQorg.w3c.dom.Node ref)Q在l定的一个子对象前再插入一个子对象。?br /><br />removeChild(org.w3c.dom.Node)Q删除给定的子节点对象。?br /><br />replaceChild(org.w3c.dom.Node newQorg.w3c.dom.Node old)Q用一个新的Node对象代替l定的子节点对象。?br /><br />NodeList对象Q顾名思义Q就是代表了一个包含了一个或者多个Node的列表。可以简单的把它看成一个Node的数l,我们可以通过Ҏ来获得列表中的元素: <br /><br />GetLength()Q返回列表的长度。?br /><br />Item(int)Q返回指定位|的Node对象。?br /><br />Element对象代表的是XML文中的标签元素Q承于NodeQ亦是Node的最主要的子对象。在标签中可以包含有属性,因而Element对象中有存取其属性的ҎQ而Q何Node中定义的ҎQ也可以用在Element对象上面。?br /><br />getElementsByTagName(String)Q返回一个NodeList对象Q它包含了在q个标签中其下的子孙节点中具有给定标{֐字的标签。?br /><br />getTagName()Q返回一个代表这个标{֐字的字符丌Ӏ?br /><br />getAttribute(String)Q返回标{中l定属性名U的属性的倹{在q儿需要主要的是,应ؓXML文中允许有实体属性出玎ͼ而这个方法对q些实体属性ƈ不适用。这时候需要用到getAttributeNodes()Ҏ来得C个Attr对象来进行进一步的操作。?br /><br />getAttributeNode(String)Q返回一个代表给定属性名U的Attr对象。?br /><br />Attr对象代表了某个标{中的属性。Attrl承于NodeQ但是因为Attr实际上是包含在Element中的Q它q不能被看作是Element的子对象Q因而在DOM中Attrq不是DOM树的一部分Q所以Node中的getparentNode()QgetpreviousSibling()和getnextSibling()q回的都是null。也是_Attr其实是被看作包含它的Element对象的一部分Q它q不作ؓDOM树中单独的一个节点出现。这一点在使用的时候要同其它的Node子对象相区别。?br /><br />需要说明的是,上面所说的DOM对象在DOM中都是用接口定义的,在定义的时候用的是与具体语言无关的IDL语言来定义的。因而,DOM其实可以在Q何面向对象的语言中实玎ͼ只要它实CDOM所定义的接口和功能可以了。同Ӟ有些Ҏ在DOM中ƈ没有定义Q是用IDL的属性来表达的,当被映射到具体的语言Ӟq些属性被映射为相应的Ҏ。?br /><br />2QDOM实例 <br /><br />有了上面的介l,怿你对DOM理解的更多了吧。下面的例子让你对DOM更加熟悉h。?br /><br />先说说这个例子到底要做的是什么吧Q我们希望在一个名为link.xml文g中保存了一些URL地址Q通过一个简单的E序Q我们可以通过DOM把这些URLdq显C出来,也可以反q来向这个XML文g中写入加入的URL地址。很单,却很实用Q也_来例CDOM的绝大部分用法了。?br /><br />XML文g本n不复杂,׃l出它的DTD了。link.xml: <br /><br /><blockquote><font size="-1">CODE:</font><hr /><pre><br /><?xml version="1.0" standalone="yes"?><br /><links><br /><link><br /><text>JSP Insider</text><br /><url newWindow="no">http://www.jspinsider.com</url><br /><author>JSP Insider</author><br /><date><br /><day>2</day><br /><month>1</month><br /><year>2001</year><br /></date><br /><description>A JSP information site.</description><br /></link><br /><link><br /><text>The makers of Java</text><br /><url newWindow="no">http://java.sun.com</url><br /><author>Sun Microsystems</author><br /><date><br /><day>3</day><br /><month>1</month><br /><year>2001</year><br /></date><br /><description>Sun Microsystem's website.</description><br /></link><br /><link><br /><text>The standard JSP container</text><br /><url newWindow="no">http://jakarta.apache.org</url><br /><author>Apache Group</author><br /><date><br /><day>4</day><br /><month>1</month><br /><year>2001</year><br /></date><br /><description>Some great software.</description><br /></link><br /></links> <br /><br /></pre><hr /></blockquote><br />W一个程序我们称为xmldisplay.javaQ具体的E序清单可以在附件中扑ֈ。主要的功能是dq个XML文g中各个节点的内容Q然后在格式化输出在System.out上,我们来看看这个程序: <br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />import javax.xml.parsers.*;<br />import org.w3c.dom.*; <br /></pre><hr /></blockquote><br />q是引入必要的类Q因为在q里使用的是Sun所提供的XML解析器,因而需要引入java.xml.parsers包,其中包含了有DOM解析器和SAX解析器的具体实现。org.w3c.dom包中定义了w3c所制定的DOM接口。?br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();<br />DocumentBuilder builder=factory.newDocumentBuilder();<br />Document doc=builder.parse("links.xml");<br />doc.normalize(); <br /></pre><hr /></blockquote><br />除了上面讲到的,q有一个小技巧,对Document对象调用normalize()Q可以去掉XML文档中作为格式化内容的空白而映在DOM树中的不必要的Text Node对象。否则你得到的DOM树可能ƈ不如你所惌的那栗特别是在输出的时候,q个normalize()更ؓ有用。?br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />NodeList links =doc.getElementsByTagName("link"); <br /></pre><hr /></blockquote><br />刚才说过QXML文中的I白W也会被作ؓ对象映射在DOM树中。因而,直接调用NodeҎ的getChildNodesҎ有时候会有些问题Q有时不能够q回所期望的NodeList对象。解决的办法是用Element的getElementByTagName(String)Q返回的NodeLise是所期待的对象了。然后,可以用item()Ҏ提取惌的元素。?br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />for (int i=0;i<links.getLength();i++){<br />Element link=(Element) links.item(i);<br />System.out.print("Content: ");<br />System.out.println(link.getElementsByTagName("text").item(0).getFirstChild().getNodeValue());<br />System.out.print("URL: ");<br />System.out.println(link.getElementsByTagName("url").item(0).getFirstChild().getNodeValue());<br />System.out.print("Author: ");<br />System.out.println(link.getElementsByTagName("author").item(0).getFirstChild().getNodeValue());<br />System.out.print("Date: ");<br />Element linkdate=(Element) link.getElementsByTagName("date").item(0);<br />String day=linkdate.getElementsByTagName("day").item(0).getFirstChild().getNodeValue();<br />String month=linkdate.getElementsByTagName("month").item(0).getFirstChild().getNodeValue();<br />String year=linkdate.getElementsByTagName("year").item(0).getFirstChild().getNodeValue();<br />System.out.println(day+"-"+month+"-"+year);<br />System.out.print("Description: ");<br />System.out.println(link.getElementsByTagName("description").item(0).getFirstChild().getNodeValue());<br />System.out.println();<br />} <br /></pre><hr /></blockquote><br />上面的代码片断就完成了对XML文内容的格式化输出。只要注意到一些细节的问题Q比如getFirstChile()Ҏ和getElementsByTagName()Ҏ的用,q些q是比较Ҏ的。?br /><br />下面的内容,是在修改了DOM树后重新写入到XML文中去的问题了。这个程序名为xmlwrite.java。在JAXP1.0版本中,q没有直接的cdҎ能够处理XML文的写入问题,需要借助其它包中的一些辅助类。而在JAXP1.1版本中,引入了对XSLT的支持,所谓XSLTQ就是对XML文q行变换QTranslationQ后Q得C个新的文结构。利用这个新加入的功能,我们p够很方便的把新生成或者修改后的DOM树从新写回到XML文g中去了,下面我们来看看代码的实现Q这D代码的主要功能是向links.xml文g中加入一个新的link节点Q?br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />import javax.xml.parsers.*;<br />import javax.xml.transform.*;<br />import javax.xml.transform.dom.DOMSource;<br />import javax.xml.transform.stream.StreamResult;<br />import org.w3c.dom.*; <br /></pre><hr /></blockquote><br />新引入的java.xml.transform包中的几个类Q就是用来处理XSLT变换的。?br /><br />我们希望在上面的XML文g中加入一个新的link节点Q因而首先还是要dlinks.xml文gQ构Z个DOM树,然后再对q个DOM树进行修改(d节点Q,最后把修改后的DOM写回到links.xml文g中: <br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();<br />DocumentBuilder builder=factory.newDocumentBuilder();<br />Document doc=builder.parse("links.xml");<br />doc.normalize();<br />//---取得变量----<br />String text="Hanzhong's Homepage";<br />String url="www.hzliu.com";<br />String author="Hzliu Liu";<br />String discription="A site from Hanzhong Liu, give u lots of suprise!!!"; <br /></pre><hr /></blockquote><br />Z看清重点Q简化程序,我们把要加入的内容硬~码到记忆String对象中,而实际操作中Q往往利用一个界面来提取用户输入Q或者通过JDBC从数据库中提取想要的内容。?br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />Text textseg;<br />Element link=doc.createElement("link"); <br /></pre><hr /></blockquote><br />首先应该明了的是Q无Z么类型的NodeQText型的也好QAttr型的也好QElement型的也好Q它们的创徏都是通过Document对象中的createXXX()Ҏ来创建的QXXX代表具体要创建的cdQ,因此Q我们要向XML文中添加一个link目Q首先要创徏一个link对象Q?br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />Element linktext=doc.createElement("text");<br />textseg=doc.createTextNode(text);<br />linktext.appendChild(textseg);<br />link.appendChild(linktext);<br />Element linkurl=doc.createElement("url");<br />textseg=doc.createTextNode(url);<br />linkurl.appendChild(textseg);<br />link.appendChild(linkurl);<br />Element linkauthor=doc.createElement("author");<br />textseg=doc.createTextNode(author);<br />linkauthor.appendChild(textseg);<br />link.appendChild(linkauthor);<br />java.util.Calendar rightNow = java.util.Calendar.getInstance();<br />String day=Integer.toString(rightNow.get(java.util.Calendar.DAY_OF_MONTH));<br />String month=Integer.toString(rightNow.get(java.util.Calendar.MONTH));<br />String year=Integer.toString(rightNow.get(java.util.Calendar.YEAR));<br />Element linkdate=doc.createElement("date");<br />Element linkdateday=doc.createElement("day");<br />textseg=doc.createTextNode(day);<br />linkdateday.appendChild(textseg);<br />Element linkdatemonth=doc.createElement("month");<br />textseg=doc.createTextNode(month);<br />linkdatemonth.appendChild(textseg);<br />Element linkdateyear=doc.createElement("year");<br />textseg=doc.createTextNode(year);<br />linkdateyear.appendChild(textseg);<br />linkdate.appendChild(linkdateday);<br />linkdate.appendChild(linkdatemonth);<br />linkdate.appendChild(linkdateyear);<br />link.appendChild(linkdate);<br />Element linkdiscription=doc.createElement("description");<br />textseg=doc.createTextNode(discription);<br />linkdiscription.appendChild(textseg);<br />link.appendChild(linkdiscription); <br /></pre><hr /></blockquote><br />创徏节点的过E可能有些千一律,但需要注意的地方是,对Element中所包含的textQ在DOM中,q些text也是代表了一个Node的,因此也必Mؓ它们创徏相应的nodeQ,不能直接用Element对象的setNodeValue()Ҏ来设|这些text的内容,而需要用创徏的Text对象的setNodeValue()Ҏ来设|文本,q样才能够把创徏的Element和其文本内容d到DOM树中。看看前面的代码Q你会更好的理解q一点: <br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />doc.getDocumentElement().appendChild(link); <br /></pre><hr /></blockquote><br />最后,不要忘记把创建好的节Ҏ加到DOM树中。DocumentcȝgetDocumentElement()ҎQ返回代表文档根节点的Element对象。在XML文中,根节点一定是唯一的。?br /><blockquote><font size="-1">CODE:</font><hr /><pre><br />TransformerFactory tFactory =TransformerFactory.newInstance();<br />Transformer transformer = tFactory.newTransformer();<br />DOMSource source = new DOMSource(doc);<br />StreamResult result = new StreamResult(new java.io.File("links.xml"));<br />transformer.transform(source, result); <br /></pre><hr /></blockquote><br />然后是用XSLT把DOM树输Z。这里的TransformerFactory也同样应用了工厂模式Q得具体的代码同具体的变换器无兟뀂实现的Ҏ和DocumentBuilderFactory相同Q这儿就不赘qC。TransformercȝtransfromҎ接受两个参数、一个数据源Source和一个输出目标Result。这里分别用的是DOMSource和StreamResultQ这样就能够把DOM的内容输出到一个输出流中,当这个输出流是一个文件的时候,DOM的内容就被写入到文g中去了?br /><img src ="http://www.aygfsteel.com/vso/aggbug/74810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/vso/" target="_blank">vso</a> 2006-10-12 16:50 <a href="http://www.aygfsteel.com/vso/articles/74810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JDOM处理XML文http://www.aygfsteel.com/vso/articles/74809.htmlvsovsoThu, 12 Oct 2006 08:48:00 GMThttp://www.aygfsteel.com/vso/articles/74809.htmlhttp://www.aygfsteel.com/vso/comments/74809.htmlhttp://www.aygfsteel.com/vso/articles/74809.html#Feedback0http://www.aygfsteel.com/vso/comments/commentRss/74809.htmlhttp://www.aygfsteel.com/vso/services/trackbacks/74809.htmlƢ迎与我讨论Qboyofjava@sina.comQ?br />
Q一QJDOM的介l以及与JAXB的比?br />
Java + XML = JDOM Q?br />q就是JDOM设计者的目标。如果你曄使用q烦人的SAX或是DOM来处理XMLQ你׃知道Z么要有JDOM或者是JAXB。在今年Q?002Q的JavaOne会议上JDOM的主要创始hJason Hunter有一精彩的演讲介绍了JDOM技术,题目是JDOM Makes XML Easy?br />在那文里QJDOM被拿来与DOM比较Q而我更愿意拿它同JAXB比较。因为JAXB和JDOM都是Z在Java中提供比DOM和SAX更ؓ方便的XML处理接口而开发的Qƈ且通过完全不同的途径来解册个问题。JDOM的处理方式是与DOMcM的树操作。而JAXB通过DTD和绑定模式来生成讉KXML文的Java代码Q将XML映射成了Java对象来操作。你可以Ҏ目的需要和个h喜好来决定采用哪一个?br />JDOM与JAXB的比较,从本w的特点来看Q?br />1)    JDOM比JAXB更容易上手。用JAXB首先要会~写DTDQ然后还要会~写l定模式。JDOM没有q样的要求,如果你会Java和XMLQ甚臛_以说光是看JDOM的javadoc文p够用JDOM?br />2)    JAXB~写好DTD和绑定模式以后,XML文被映成了Java对象Q其数据是Java对象的属性,q数据类型都做好了{换,因此Q访问XML文档比JDOM要简便,可以说是一x逸?br />3)    JAXB由某个DTD和绑定模式生成的代码只能讉K该DTD所U束的文档。如果想要访问其他XML文Q需要再~写DTD和绑定模式。JDOM可以处理MXML文Q包括受U束的和不受U束的?br />
目前JDOM和JAXB都没有正式版本。JDOM的最新版本是beta8QJAXB?.0 early accessQ其规范版本?.21。相对而言QJDOM更成熟一些。例如JAXB不支持名字空间、不能向XML文档写入处理指oQ有时我们需要保留的换行W和首尾I格在JAXB中自动过滤掉了,p攑֜<![CDATA[ 和 ]]>里面也不能幸免。JDOM没有这些限制。如果说以上?Ҏ较是JDOM和JAXB本n的特Ҏ军_的,几乎不可能改变,那么q里表明QJAXBq需要更多的工作?br />
Q二Q获得ƈ安装JDOM
在http://jdom.org可以下蝲JDOM的最新版本。以JDOM beta8?q制版本Z。下载后解压~,JDOM的jar文g是build目录下的文gjdom.jarQ将之加入类路径。另外JDOMq需要lib目录下那些jar文g如xerces.jar的支持。如果在使用中出C下错误:
java.lang.NoSuchMethodError
或?br />java.lang.NoClassDefFoundError: org/xml/sax/SAXNotRecognizedException
你需要保证xerces.jar文g在CLASSPATH中位于其他XMLc,如JAXP或Crimson之前Q这些类文gQ包括以前老版本的xercesQ可能不支持SAX2.0或DOM Level 2。于是导致了上面的错误?br />
Q三Q一个简单的例子
JDOM的处理方式有些类gDOMQ但它主要是用SAX实现的,你不必担心处理速度和内存的问题。另外,JDOM中几乎没有接口,的类全部是实实在在的c,没有cd厂类的。其最重要的一个包org.jdom中主要有以下c:
? Attribute
? CDATA
? Comment
? DocType
? Document
? Element
? EntityRef
? Namespace
? ProcessingInstruction
?    Text
数据输入要用到XML文档要通过org.jdom.input包,反过来需要org.jdom.output。如前面所_x看API文p够用?br />我们的例子读入XML文gexampleA.xmlQ加入一条处理指令,修改W一本书的h格和作者,q添加一条属性,然后写入文gexampleB.xmlQ?br />//exampleA.xml
<?xml version="1.0" encoding="GBK"?>
<bookList>
    <book>
        <name>Java~程入门</name>
        <author>张三</author>
        <publishDate>2002-6-6</publishDate>
        <price>35.0</price>
    </book>
    <book>
        <name>XML在Java中的应用</name>
        <author>李四</author>
        <publishDate>2002-9-16</publishDate>
        <price>92.0</price>
    </book>
</bookList>

//testJDOM.java
import org.jdom.*;
import org.jdom.output.*;
import org.jdom.input.*;
import java.io.*;
public class TestJDOM{
    public static void main(String args[])throws Exception{
        
        SAXBuilder sb = new SAXBuilder();

        //从文件构造一个DocumentQ因为XML文g中已l指定了~码Q所以这里不必了
        Document doc = sb.build(new FileInputStream("exampleA.xml"));
        
        //加入一条处理指令\
        ProcessingInstruction pi = new ProcessingInstruction
            ("xml-stylesheet","href=\"bookList.html.xsl\" type=\"text/xsl\"");
        doc.addContent(pi);


        Element root = doc.getRootElement(); //得到根元?br />        java.util.List books = root.getChildren(); //得到根元素所有子元素的集?br />        Element book = (Element)books.get(0); //得到W一个book元素
        //为第一本书d一条属?br />        Attribute a = new Attribute("hot","true");  
        book.setAttribute(a);
        Element author = book.getChild("author"); //得到指定的字元素
        author.setText("王五\\"); //作者改为王?br />        //或 Text t = new Text("王五\\");book.addContent(t);
        Element price = book.getChild("price"); //得到指定的字元素
        //修改hQ比较郁L是我们必自p{换数据类型,而这正是JAXB的优?br />        author.setText(Float.toString(50.0f)); 
        


        String indent = "    ";
        boolean newLines = true;
        XMLOutputter outp = new XMLOutputter(indent,newLines,"GBK");
        outp.output(doc, new FileOutputStream("exampleB.xml"));

    }
};

执行l果exampleB.xmlQ?br /><?xml version="1.0" encoding="GBK"?>
<bookList>
    <book hot=”true?gt;
        <name>Java~程入门</name>
        <author>50.0</author>
        <publishDate>2002-6-6</publishDate>
        <price>35.0</price>
    </book>
    <book>
        <name>XML在Java中的应用</name>
        <author>李四</author>
        <publishDate>2002-9-16</publishDate>
        <price>92.0</price>
    </book>
</bookList>
<?xml-stylesheet href="bookList.html.xsl" type="text/xsl"?>

在默认情况下QJDOM的ElementcȝgetText()q类的方法不会过滤空白字W,如果你需要过滤,用setTextTrim() ?br />

Q四Q参考文?br />1)    JDOM Makes XML Easy (http://www.servlets.com/speaking/jdom-javaone.pdf)
2)    The Java &#8482; Architecture for XML Binding User’s Guide (http://java.sun.com/xml/jaxb/jaxb-docs.pdf)
3)    Web Services Made Easier. The Java TM APIs and Architectures for XML, A Technical White Paper (http://java.sun.com/xml/webservices.pdf )


vso 2006-10-12 16:48 发表评论
]]>
Java~程中更新XML文的常用方?/title><link>http://www.aygfsteel.com/vso/articles/74808.html</link><dc:creator>vso</dc:creator><author>vso</author><pubDate>Thu, 12 Oct 2006 08:47:00 GMT</pubDate><guid>http://www.aygfsteel.com/vso/articles/74808.html</guid><wfw:comment>http://www.aygfsteel.com/vso/comments/74808.html</wfw:comment><comments>http://www.aygfsteel.com/vso/articles/74808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/vso/comments/commentRss/74808.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/vso/services/trackbacks/74808.html</trackback:ping><description><![CDATA[本文要的讨论了Java语言~程中更新XML文的四U常用方?q且分析q四U方法的优劣。其?本文q对如何控制JavaE序输出的XML文的格式做了展开。?br /><br /><br /><br />JAXP是Java API for XML Processing的英文字头羃?中文含义?用于XML文处理的用Java语言~写的编E接口。JAXP支持DOM、SAX、XSLT{标准。ؓ了增强JAXP使用上的灉|?开发者特别ؓJAXP设计了一个Pluggability Layer,在Pluggability Layer的支持之?JAXP既可以和具体实现DOM API、SAX API 的各UXML解析?XML Parser,例如Apache Xerces)联合工作,又可以和具体执行XSLT标准的XSLT处理?XSLT Processor,例如Apache Xalan)联合工作。应用Pluggability Layer的好处在?我们只需要熟悉JAXP各个~程接口的定义即?而不需要对所采用的具体的XML解析器、XSLT处理器有很深入的了解。比如在某个JavaE序?通过JAXP调用XML解析器Apache Crimson对XML文q行处理,如果我们希望使用别的XML解析?比如Apache Xerces),以便提高该程序的性能,那么原程序代码可能不需要Q何改?直接可以?你所需要做的事情只是将包含Apache Xerces代码的jar文g加入到环境变量CLASSPATH?而将包含Apache Crimson代码的jar文g在环境变量CLASSPATH中删?。?br /><br /><br /><br />目前JAXP已经应用的十分普遍了,可以说是Java语言中处理XML文的标准API。有些初学者在学习使用JAXP的过E中,l常会提L问题:我编写的E序对DOM Tree做了更新,但是当程序退Z?原始的XML文q没有改?q是老样?如何实现对原始XML文和DOM Tree的同步更新呢?咋一看来,在JAXP中似乎没有提供相应的接口/Ҏ/c?q是很多初学者都感到困惑的问题。本文的L在于解册个问?单的介绍几种常用的同步更新原始XML文档和DOM Tree的方法。ؓ了羃讨论的范围,本文所涉及的XML解析器仅包括Apache Crimson和Apache Xerces,而XSLT处理器仅仅用Apache Xalan。?br /><br /><br /><br />Ҏ一:直接dXML文 <br /><br /><br /><br />q也许是最W最原始的办法了。当E序获取DOM Tree之后,应用DOM模型的Node接口的各个方法对DOM Treeq行更新,下一步应该对原始的XML文q行更新了。我们可以运用递归的办法或者是应用TreeWalkerc?遍历整个DOM Tree,与此同时,DOM Tree的每一个节?元素依次写入到预先打开的原始XML文?当DOM Tree被遍历完全之?DOM Tree和原始的XML文实C同步更新。实际中,q个Ҏ极少使用,不过如果你要~程实现自己的XML解析?q种Ҏq是有可能用得上的。?br /><br /><br /><br />Ҏ?使用XmlDocumentc?br /><br /><br /><br />使用XmlDocumentc?JAXP中分明没有这个类呀!是不是作者搞错了?没有?是使用XmlDocumentc?切的说,是用XmlDocumentcȝwrite()Ҏ。?br /><br /><br /><br />在上文已l提到过,JAXP可以和各U各LXML解析器联合?q次我们选用的XML解析器是Apache Crimson。XmlDocument(org.apache.crimson.tree.XmlDocument)是Apache Crimson的一个类,q不包含于标准的JAXP?难怪在JAXP的文档中找不到XmlDocumentcȝ芌呢。现在问题出来了,如何应用XmlDocumentcL实现更新XML文的功?在XmlDocumentcM提供了下面三个write()Ҏ(ҎCrimson最新的版本------Apache Crimson 1.1.3): <br /><br /><br /><br /><br /><br /><br /><br />public void write (OutputStream out) throws IOException <br /><br />public void write (Writer out) throws IOException <br /><br />public void write (Writer out, String encoding) throws IOException <br /><br /><br /><br /><br /><br /><br /><br />上述三个write()Ҏ的主要作用就是输出DOM Tree中的内容到特定的输出介质?比如文g输出、应用程序控制台{等。那么又如何使用上述三个write()Ҏ?L下面的JavaE序代码片断: <br /><br /><br /><br /><br /><br />String name="fancy"; <br /><br />DocumentBuilder parser; <br /><br />DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); <br /><br />try <br /><br />{ <br /><br />parser = factory.newDocumentBuilder(); <br /><br />Document doc = parser.parse("user.xml"); <br /><br />Element newlink=doc.createElement(name); <br /><br />doc.getDocumentElement().appendChild(newlink); <br /><br />((XmlDocument)doc).write(new FileOutputStream(new File("xuser1.xml"))); <br /><br />} <br /><br />catch (Exception e) <br /><br />{ <br /><br />//to log it <br /><br />} <br /><br /><br /><br /><br /><br /><br /><br />在上面的代码?首先创徏了一个Document对象doc,获取完整的DOM Tree,然后应用Node接口的appendChild()Ҏ,在DOM Tree的最后追加了一个新节点(fancy),最后调用XmlDocumentcȝwrite(OutputStream out)Ҏ,把DOM Tree中的内容输出到xuser.xml?其实也可以输出到user.xml,更新原始的XML文,在这里ؓ了便于做Ҏ,故而输出到xuser.xml文g?。需要注意的是不能直接对Document对象doc直接调用write()Ҏ,因ؓJAXP的Document接口q没有定义Q何write()Ҏ,所以必ddoc由Document对象强制转换为XmlDocument对象,然后才能调用write()Ҏ,在上面的代码中用的是write(OutputStream out)Ҏ,q个Ҏ使用~省的UTF-8~码输出DOM Tree中的内容到特定的输出介质?如果DOM Tree中包含中文字W?那么输出的结果有可能是ؕ?亦即存在所谓的"汉字问题\\",解决的办法是使用write (Writer out, String encoding)Ҏ,昑ּ指定输出时的~码,例如第二个参数设ؓ"GB2312",q时即不存在"汉字问题\\",输出l果能够正常昄中文字符。?br /><br /><br /><br />完整的例子请参考下列文? AddRecord.java(见附?、user.xml(见附?。该例子的运行环境ؓ:Windows XP Professional、JDK 1.3.1。ؓ了能够正常编译运行AddRecord.javaq个E序,你需要到|址http://xml.apache.org/dist/crimson/M载Apache Crimson,q将所获取的crimson.jar文g加入到环境变量CLASSPATH中。?br /><br /><br /><br />注意: <br /><br /><br /><br />Apache Crimson的前w是Sun Project X Parser,后来不知何故,由X Parser演变为Apache Crimson,至今Apache Crimson的很多代码都是从X Parser中直接移植过来的。比如上文用到的XmlDocumentc?它在X Parser中是com.sun.xml.XmlDocument,CApache Crimson中摇w一?变成了org.apache.crimson.tree.XmlDocumentc?其实它们的绝大部分代码是一L,可能package语句和import语句以及文g开头的一Dlience有所不同而已。早期的JAXP是和X Parser捆绑在一L,因此一些老的E序使用了com.sun.xml?如果你现在重新编译它?有可能不能通过,肯定是因ؓq个原因。后来的JAXP和Apache Crimson捆绑在一?比如JAXP 1.1,如果你用JAXP 1.1,那么不需要额外下载Apache Crimson,也能够正常编译运行上面的例子(AddRecord.java)。最新的JAXP 1.2 EA(Early Access)改u更张,采用性能更好的Apache Xalan和Apache Xerces分别作ؓXSLT处理器和XML解析?不能直接支持Apache Crimson?所以如果你的开发环境采用了JAXP 1.2 EA或者是Java XML Pack(内含JAXP 1.2 EA),那么无法直接编译运行上面的例子(AddRecord.java),你需要额外下载ƈ安装Apache Crimson。?br /><br /><br /><br />Ҏ?使用TransformerFactory和Transformerc?br /><br /><br /><br />在JAXP中所提供的标准的更新原始XML文档的方法就是调用XSLT引擎,亦即使用TransformerFactory和TransformercR请看下面的Java代码片断: <br /><br /><br /><br /><br /><br />//首先创徏一个DOMSource对象,该构造函数的参数可以是一个Document对象 <br /><br />//doc代表更改后的DOM Tree。?br /><br />DOMSource doms = new DOMSource (doc); <br /><br /><br /><br />//创徏一个File对象,代表DOM Tree所包含的数据的输出介质,q是一个XML文g。?br /><br />File f = new File ("XMLOutput.xml"); <br /><br /><br /><br />//创徏一个StreamResult对象,该构造函数的参数可以取ؓFile对象。?br /><br />StreamResult sr = new StreamResult (f); <br /><br /><br /><br />//下面调用JAXP中的XSLT引擎来实现输出DOM Tree中的数据到XML文g中的功能。?br /><br />//XSLT引擎的输入ؓDOMSource对象,输出为StreamResut对象。?br /><br />try <br /><br />{ <br /><br />//首先创徏一个TransformerFactory对象,再由此创建Transformer对象。Transformer <br /><br />//cȝ当于一个XSLT引擎。通常我们使用它来处理XSL文g,但是在这里我们 <br /><br />//用它来输出XML文。?br /><br />TransformerFactory tf=TransformerFactory.newInstance(); <br /><br />Transformer t=tf.newTransformer (); <br /><br /><br /><br />//关键的一? 调用Transformer对象 (XSLT引擎)的transform()Ҏ,该方法的W一 <br /><br />//个参数是DOMSource对象,W二个参数是StreamResult对象。?br /><br />t.transform(doms,sr); <br /><br />} <br /><br />catch (TransformerConfigurationException tce) <br /><br />{ <br /><br />System.out.println("Transformer Configuration Exception<br />-----"); <br /><br />tce.printStackTrace(); <br /><br />} <br /><br />catch (TransformerException te) <br /><br />{ <br /><br />System.out.println ("Transformer Exception<br />---------"); <br /><br />te.printStackTrace (); <br /><br />} <br /><br /><br /><br /><br /><br />在实际的应用?我们可以应用传统的DOM API从XML文档中获取DOM Tree,然后Ҏ实际的需求对DOM Tree执行各种操作,得到最l的Document对象,接下来可以由此Document对象创徏DOMSource对象,剩下的事情就是照搬上面的代码?E序q行完毕? XMLOutput.xml是你所需要的l果(当然?你可以随意更改StreamResultcL造函数的参数,指定不同的输Z?而不必是千篇一律的XML文档)。?br /><br /><br /><br />q个Ҏ最大的好处在于可以随心所Ʋ的控制DOM Tree中的内容输出到输Z质中的格?但是光靠TransformerFactorycdTransformercdƈ不能实现q个功能,q需要依赖OutputKeyscȝ帮助。 完整的例子请参考下列文? AddRecord2.java(见附?、user.xml(见附?。该例子的运行环境ؓ:Windows XP Professional、JDK 1.3.1。ؓ了能够正常编译运行AddRecord2.javaq个E序,你需要到|址http://java.sun.comM载安装JAXP 1.1或者Java XML Pack(Java XML Pack已经内含JAXP?。?br /><br /><br /><br />OutputKeysc?br /><br /><br /><br />javax.xml.transform.OutputKeyscdjava.util.Propertiesc配合?可以控制JAXP的XSLT引擎(Transformerc?输出XML文档的格式。请看下面的代码片断: <br /><br /><br /><br /><br /><br />//首先创徏一个TransformerFactory对象,再由此创建Transformer对象。?br /><br />TransformerFactory tf=TransformerFactory.newInstance(); <br /><br />Transformer t=tf.newTransformer (); <br /><br /><br /><br />//获取Transformser对象的输出属?亦即XSLT引擎的缺省输出属?q是一个?br /><br />//java.util.Properties对象。?br /><br />Properties properties = t.getOutputProperties(); <br /><br /><br /><br />//讄新的输出属?输出字符~码为GB2312,q样可以支持中文字符,XSLT引擎所输出 <br /><br />//的XML文如果包含了中文字W?可以正常昄,不会出现所谓的"汉字问题\\"。?br /><br />//L意OutputKeyscȝ字符串常数OutputKeys.ENCODING。?br /><br />properties.setProperty(OutputKeys.ENCODING,"GB2312"); <br /><br /><br /><br />/更新XSLT引擎的输出属性。?br /><br />t.setOutputProperties(properties); <br /><br /><br /><br />//调用XSLT引擎,按照输出属性中的设|?输出DOM Tree中的内容到输Z质中。?br /><br />t.transform(DOMSource_Object,StreamResult_Object); <br /><br /><br /><br /><br /><br /><br /><br /><br /><br />从上面的E序代码,我们不难看出,通过讄XSLT引擎(Transformerc?的输出属?可以控制DOM Tree中的内容的输出格?q对于我们定制输出内Ҏ很有帮助的。那么JAXP的XSLT引擎(Transformerc?有那些输出属性可以设|呢? javax.xml.transform.OutputKeyscd义了很多字符串常?它们都是可以自由讄的输出属?常用的输出属性如下所C? <br /><br /><br /><br />public static final java.lang.String METHOD <br /><br /><br /><br /><br /><br />可以设ؓ"xml"?html"?text"{倹{?br /><br /><br /><br />public static final java.lang.String VERSION <br /><br /><br /><br /><br /><br />所遵@规范的版本号,如果METHOD设ؓ"xml",那么它的值应该设?1.0",如果METHOD设ؓ"html",那么它的值应该设?4.0",如果METHOD设ؓ"text",那么q个输出属性会被忽略。?br /><br /><br /><br />public static final java.lang.String ENCODING <br /><br /><br /><br /><br /><br />讄输出时所采用的编码方?比如\\"GB2312"?UTF-8"{等,如果其讄?GB2312",可以解决所谓的"汉字问题\\"。?br /><br /><br /><br />public static final java.lang.String OMIT_XML_DECLARATION <br /><br /><br /><br />讄输出到XML文中时是否忽略XML声明,亦即cM? <br /><br /><br /><br /><?xml version="1.0" standalone="yes" encoding="utf-8" ?> <br /><br /><br /><br /><br /><br />q样的代码。它可选的值有"yes"?no"。?br /><br /><br /><br />public static final java.lang.String INDENT <br /><br /><br /><br /><br /><br />IDENT讑֮XSLT引擎在输出XML文档?是否自动d额外的空?它可选的gؓ"yes"?no"。?br /><br /><br /><br />public static final java.lang.String MEDIA_TYPE <br /><br /><br /><br />MEDIA_TYPE讑֮输出文档的MIMEcd。?br /><br /><br /><br />如果讑֮XSLT引擎的输出属性呢?下面我们来ȝ一? <br /><br /><br /><br />首先是获取XSLT引擎(Transformerc?的缺省输出属性的集合,q需要用TransformercȝgetOutputProperties()Ҏ,q回值是一个java.util.Properties对象。?br /><br /><br /><br />Properties properties = transformer.getOutputProperties(); <br /><br /><br /><br /><br /><br />然后是设定新的输出属?比如: <br /><br /><br /><br />properties.setProperty(OutputKeys.ENCODING,"GB2312"); <br /><br />properties.setProperty(OutputKeys.METHOD,"html"); <br /><br />properties.setProperty(OutputKeys.VERSION,"4.0"); <br /><br />………………………………………………………?br /><br /><br /><br /><br /><br />最后是更新XSLT引擎(Transformerc?的缺省输出属性的集合,q需要用TransformercȝsetOutputProperties()Ҏ,参数是一个java.util.Properties对象。?br /><br /><br /><br />我们~写了一个新的程?其中应用了OutputKeysc?用以控制XSLT引擎的输出属?该程序的架构和前一个程?AddRecord3.java)大致相同,不过输出l果略有不同。完整的代码请参考下列文? AddRecord3.java(见附?、user.xml(见附?。该例子的运行环境ؓ:Windows XP Professional、JDK 1.3.1。ؓ了能够正常编译运行AddRecord3.javaq个E序,你需要到|址http://java.sun.comM载安装JAXP 1.1或者Java XML Pack(Java XML Pack内含JAXP?。?br /><br /><br /><br />Ҏ?使用Xalan XML Serializer <br /><br /><br /><br />Ҏ四其实是Ҏ三的一个变U?它需要Apache Xalan和Apache Xerces的支持才能够q行。例子代码如下所C? <br /><br /><br /><br /><br /><br />//首先创徏一个DOMSource对象,该构造函数的参数可以是一个Document对象 <br /><br />//doc代表更改后的DOM Tree。?br /><br />DOMSource domSource = new DOMSource (doc); <br /><br /><br /><br />//创徏一个DOMResult对象,临时保存XSLT引擎的输出结果。?br /><br />DOMResult domResult = new DOMResult(); <br /><br /><br /><br />//下面调用JAXP中的XSLT引擎来实现输出DOM Tree中的数据到XML文g中的功能。?br /><br />//XSLT引擎的输入ؓDOMSource对象,输出为DOMResut对象。?br /><br />try <br /><br />{ <br /><br />//首先创徏一个TransformerFactory对象,再由此创建Transformer对象。Transformer <br /><br />//cȝ当于一个XSLT引擎。通常我们使用它来处理XSL文g,但是在这里我们 <br /><br />//用它来输出XML文档。?br /><br />TransformerFactory tf=TransformerFactory.newInstance(); <br /><br />Transformer t=tf.newTransformer (); <br /><br /><br /><br />//讄XSLT引擎的属?必不可少,否则会生\\"汉字问题\\")。?br /><br />Properties properties = t.getOutputProperties(); <br /><br />properties.setProperty(OutputKeys.ENCODING,"GB2312"); <br /><br />t.setOutputProperties(properties); <br /><br /><br /><br />//关键的一? 调用Transformer对象 (XSLT引擎)的transform()Ҏ,该方法的W一 <br /><br />//个参数是DOMSource对象,W二个参数是DOMResult对象。?br /><br />t.transform(domSource,domResult); <br /><br /><br /><br />//创徏~省的Xalan XML Serializer,使用它将临时存放在DOMResult对象 <br /><br />//(domResult)中的内容以输出流的Ş式输出到输出介质中。?br /><br />Serializer serializer = SerializerFactory.getSerializer <br /><br />(OutputProperties.getDefaultMethodProperties("xml")); <br /><br /><br /><br />//讄Xalan XML Serializer的输出属?q一步必不可?否则也可能生?br /><br />//所谓的"汉字问题\\"。?br /><br />Properties prop=serializer.getOutputFormat(); <br /><br />prop.setProperty("encoding","GB2312"); <br /><br />serializer.setOutputFormat(prop); <br /><br /><br /><br />//创徏一个File对象,代表DOM Tree所包含的数据的输出介质,q是一个XML文g。?br /><br />File f = new File ("xuser3.xml"); <br /><br /><br /><br />//创徏文g输出对象fos,L意构造函数的参数。?br /><br />FileOutputStream fos=new FileOutputStream(f); <br /><br /><br /><br />//讄Xalan XML Serializer的输出流。?br /><br />serializer.setOutputStream(fos); <br /><br /><br /><br />//串行化输出结果。?br /><br />serializer.asDOMSerializer().serialize(domResult.getNode()); <br /><br />} <br /><br />catch (Exception tce) <br /><br />{ <br /><br />tce.printStackTrace(); <br /><br />} <br /><br /><br /><br /><br /><br /><br /><br />q个Ҏ不太常用,而且g有点画蛇添,所以我们就不展开讨论了。完整的例子请参考下列文? AddRecord4.java(见附?、user.xml(见附?。该例子的运行环境ؓ:Windows XP Professional、JDK 1.3.1。ؓ了能够正常编译运行AddRecord4.javaq个E序,你需要到|址http://xml.apache.org/dist/M载安装Apache Xalan和Apache Xerces。?br /><br /><br /><br />或者是到网址http://java.sun.com/xml/download.htmlM载安装Java XML Pack。因为最新的Java XML Pack(Winter 01 ?包含了Apache Xalan和Apache Xerces技术在内。?br /><br /><br /><br />l论: <br /><br /><br /><br />本文略的讨论了Java语言~程中更新XML文档的四U方法。第一U方法是直接dXML文g,q种Ҏ十分J琐,而且比较Ҏ出错,极少使用,除非你需要开发自qXML Parser,否则不会使用q种Ҏ。第二种Ҏ是用Apache Crimson的XmlDocumentc?q种Ҏ极ؓ?使用方便,如果你选用Apache Crimson作ؓXML解析?那么不妨使用q种Ҏ,不过q种Ҏg效率不高(源于效率低下的Apache Crimson),另外,高版本的JAXP或者是Java XML Pack、JWSDP不直接支持Apache Crimson,亦即q种Ҏ不通用。第三种Ҏ是用JAXP的XSLT引擎(Transformerc?来输出XML文档,q种Ҏ也许是标准的Ҏ?使用h十分灉|,特别是可以自如控制输出格?我们推荐采用q种Ҏ。第四种Ҏ是第三种Ҏ的变U?采用了Xalan XML Serializer,引入了串行化操作,对于大量文档的修?输出有优?可惜的是要重复设|XSLT引擎的属性和XML Serializer的输出属?比较ȝ,而且依赖于Apache Xalan和Apache Xerces技?通用性略显不뀂?br /><br /><br /><br />除了上面讨论的四U方法以?实际上应用别的API(比如JDOM、Castor、XML4J、Oracle XML Parser V2)也有很多办法可以更新XML文档,限于幅,在这里就不一一讨论了。?br /><br /><br /><br />参考文献以及资料来? <br /><br /><br /><br />[1]The Java Web Services Tutorial, Sun Microsystems Inc. <br /><br /><br /><br />[2]http://xml.apache.org,Apache XML Project(Crimson、Xerces、Xalan) <br /><br /><br /><br />[3]http://www.jguru.com,XML Forum <br /><br /><br /><br />[4]http://forum.java.sun.com,Java Technology & XML Forum <br /><img src ="http://www.aygfsteel.com/vso/aggbug/74808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/vso/" target="_blank">vso</a> 2006-10-12 16:47 <a href="http://www.aygfsteel.com/vso/articles/74808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML入门常见问题(1)http://www.aygfsteel.com/vso/articles/74744.htmlvsovsoThu, 12 Oct 2006 03:00:00 GMThttp://www.aygfsteel.com/vso/articles/74744.htmlhttp://www.aygfsteel.com/vso/comments/74744.htmlhttp://www.aygfsteel.com/vso/articles/74744.html#Feedback0http://www.aygfsteel.com/vso/comments/commentRss/74744.htmlhttp://www.aygfsteel.com/vso/services/trackbacks/74744.htmlhttp://tech.ddvip.com/2006-04/11440049402881.html

vso 2006-10-12 11:00 发表评论
]]>
XML ~程思想:知识理的基?XML ?RDF 技?7)http://www.aygfsteel.com/vso/articles/74742.htmlvsovsoThu, 12 Oct 2006 02:58:00 GMThttp://www.aygfsteel.com/vso/articles/74742.htmlhttp://www.aygfsteel.com/vso/comments/74742.htmlhttp://www.aygfsteel.com/vso/articles/74742.html#Feedback0http://www.aygfsteel.com/vso/comments/commentRss/74742.htmlhttp://www.aygfsteel.com/vso/services/trackbacks/74742.htmlhttp://tech.ddvip.com/2006-08/11551014997207.html

vso 2006-10-12 10:58 发表评论
]]>
?XML ?Java 代码的数据绑定(1Q?/title><link>http://www.aygfsteel.com/vso/articles/74735.html</link><dc:creator>vso</dc:creator><author>vso</author><pubDate>Thu, 12 Oct 2006 02:54:00 GMT</pubDate><guid>http://www.aygfsteel.com/vso/articles/74735.html</guid><wfw:comment>http://www.aygfsteel.com/vso/comments/74735.html</wfw:comment><comments>http://www.aygfsteel.com/vso/articles/74735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/vso/comments/commentRss/74735.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/vso/services/trackbacks/74735.html</trackback:ping><description><![CDATA[转蝲:<a ><br />http://tech.ddvip.com/2006-08/11551105717235.html</a><img src ="http://www.aygfsteel.com/vso/aggbug/74735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/vso/" target="_blank">vso</a> 2006-10-12 10:54 <a href="http://www.aygfsteel.com/vso/articles/74735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML入门指南(11)XML解析?/title><link>http://www.aygfsteel.com/vso/articles/74732.html</link><dc:creator>vso</dc:creator><author>vso</author><pubDate>Thu, 12 Oct 2006 02:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/vso/articles/74732.html</guid><wfw:comment>http://www.aygfsteel.com/vso/comments/74732.html</wfw:comment><comments>http://www.aygfsteel.com/vso/articles/74732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/vso/comments/commentRss/74732.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/vso/services/trackbacks/74732.html</trackback:ping><description><![CDATA[转蝲:<br /><a >http://tech.ddvip.com/2006-04/11440139403001.html</a><img src ="http://www.aygfsteel.com/vso/aggbug/74732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/vso/" target="_blank">vso</a> 2006-10-12 10:46 <a href="http://www.aygfsteel.com/vso/articles/74732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML入门_解之结构与语法http://www.aygfsteel.com/vso/articles/74731.htmlvsovsoThu, 12 Oct 2006 02:40:00 GMThttp://www.aygfsteel.com/vso/articles/74731.htmlhttp://www.aygfsteel.com/vso/comments/74731.htmlhttp://www.aygfsteel.com/vso/articles/74731.html#Feedback0http://www.aygfsteel.com/vso/comments/commentRss/74731.htmlhttp://www.aygfsteel.com/vso/services/trackbacks/74731.htmlhttp://tech.ddvip.com/2006-04/11440051202885.html

vso 2006-10-12 10:40 发表评论
]]>
XML信息?/title><link>http://www.aygfsteel.com/vso/articles/74486.html</link><dc:creator>vso</dc:creator><author>vso</author><pubDate>Wed, 11 Oct 2006 02:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/vso/articles/74486.html</guid><wfw:comment>http://www.aygfsteel.com/vso/comments/74486.html</wfw:comment><comments>http://www.aygfsteel.com/vso/articles/74486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/vso/comments/commentRss/74486.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/vso/services/trackbacks/74486.html</trackback:ping><description><![CDATA[ <p>转蝲:<br /><a >http://man.ddvip.com/web/xml_infoset/index.html</a></p> <img src ="http://www.aygfsteel.com/vso/aggbug/74486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/vso/" target="_blank">vso</a> 2006-10-11 10:27 <a href="http://www.aygfsteel.com/vso/articles/74486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML初学q阶http://www.aygfsteel.com/vso/articles/74475.htmlvsovsoWed, 11 Oct 2006 02:21:00 GMThttp://www.aygfsteel.com/vso/articles/74475.htmlhttp://www.aygfsteel.com/vso/comments/74475.htmlhttp://www.aygfsteel.com/vso/articles/74475.html#Feedback0http://www.aygfsteel.com/vso/comments/commentRss/74475.htmlhttp://www.aygfsteel.com/vso/services/trackbacks/74475.htmlhttp://man.ddvip.com/web/xmljj/index.htm

vso 2006-10-11 10:21 发表评论
]]>
XML指南http://www.aygfsteel.com/vso/articles/74470.htmlvsovsoWed, 11 Oct 2006 02:20:00 GMThttp://www.aygfsteel.com/vso/articles/74470.htmlhttp://www.aygfsteel.com/vso/comments/74470.htmlhttp://www.aygfsteel.com/vso/articles/74470.html#Feedback0http://www.aygfsteel.com/vso/comments/commentRss/74470.htmlhttp://www.aygfsteel.com/vso/services/trackbacks/74470.htmlhttp://man.ddvip.com/web/xmlzhzn/xml_cn/default.asp.htm

vso 2006-10-11 10:20 发表评论
]]>
վ֩ģ壺 ɽ| | ٸ| ƽ| | ʲ| | Զ| | ɽ| ʡ| | ˮ| ʡ| | | ָ| ͼ| | Ǹ| | »| Դ| Ѱ| | | | Ϣ| | ֣| Ρɽ| | | | | | | | ׸| | ٲ|