??xml version="1.0" encoding="utf-8" standalone="yes"?>国产在线资源,久热精品在线视频,欧美日一区二区http://www.aygfsteel.com/fjq639/archive/2005/12/20/24833.html黑石黑石Tue, 20 Dec 2005 10:02:00 GMThttp://www.aygfsteel.com/fjq639/archive/2005/12/20/24833.htmlhttp://www.aygfsteel.com/fjq639/comments/24833.htmlhttp://www.aygfsteel.com/fjq639/archive/2005/12/20/24833.html#Feedback1http://www.aygfsteel.com/fjq639/comments/commentRss/24833.htmlhttp://www.aygfsteel.com/fjq639/services/trackbacks/24833.html  Junit试是程序员?gu)试Q即所谓白盒测试,因ؓE序员知道被试的Y件如何(HowQ完成功能和完成什么样QWhatQ的功能?BR>  Junit本质上是一套框Ӟ卛_发者制定了一套条条框框,遵@q此条条框框要求~写试代码Q如l承某个c,实现某个接口Q就可以用Junitq行自动试了?BR>  ׃Junit相对独立于所~写的代码,可以试代码的编写可以先于实C码的~写QXP 中推崇的 test first design的实现有了现成的手段Q用Junit写测试代码,写实C码,q行试Q测试失败,修改实现代码Q再q行试Q直到测试成功。以后对代码的修改和优化Q运行测试成功,则修Ҏ(gu)功?BR>  Java 下的 team 开发,采用 cvs(版本控制) + ant(目理) + junit(集成试) 的模式时Q通过对ant的配|,可以很简单地实现试自动化?BR>
  对不同性质的被对象,如ClassQJspQServletQEjb{,Junit有不同的使用技巧,以后慢慢地分别讲叙。以下以Class试Z讲解Q除非特D说明?BR>
2、下载安?BR>

去Junit主页下蝲最新版?.8.1E序包junit-3.8.1.zip

用winzip或unzipjunit-3.8.1.zip解压~到某一目录名ؓ$JUNITHOME

junit.jar?JUNITHOME/junit加入到CLASSPATH中,加入后者只因ؓ试例程在那个目录下?BR>
注意不要junit.jar攑֜jdk的extension目录?BR>
q行命o,l果如下图?BR>java junit.swingui.TestRunner junit.samples.AllTests



3、Junit架构
  下面以Moneyq个cMؓ例进行说明?BR>
public class Money {
    private int fAmount;//余额
    private String fCurrency;//货币cd

    public Money(int amount, String currency) {
        fAmount= amount;
        fCurrency= currency;
    }

    public int amount() {
        return fAmount;
    }

    public String currency() {
        return fCurrency;
    }
   
    public Money add(Money m) {//加钱
        return new Money(amount()+m.amount(), currency());
    }
   
    public boolean equals(Object anObject) {//判断钱数是否相等
        if (anObject instanceof Money) {
            Money aMoney= (Money)anObject;
            return aMoney.currency().equals(currency())
                && amount() == aMoney.amount();
        }
        return false;
    }   
}


  Junit本n是围l着两个设计模式来设计的Q命令模式和集成模式.

命o模式
  利用TestCase定义一个子c,在这个子cM生成一个被试的对象,~写代码某个方法被调用后对象的状态与预期的状态是否一_q而断aE序代码有没有bug?BR>  当这个子c要试不只一个方法的实现代码Ӟ可以先徏立测试基Q让q些试在同一个基上运行,一斚w可以减少每个试的初始化Q而且可以试q些不同Ҏ(gu)之间的联pR?BR>  例如Q我们要试Money的AddҎ(gu)Q可以如?
public class MoneyTest extends TestCase { //TestCase的子c?BR>    public void testAdd() { //把测试代码放在testAdd?BR>        Money m12CHF= new Money(12, "CHF");  //本行和下一行进行一些初始化
        Money m14CHF= new Money(14, "CHF");        
        Money expected= new Money(26, "CHF");//预期的结?BR>        Money result= m12CHF.add(m14CHF);    //q行被测试的Ҏ(gu)
        Assert.assertTrue(expected.equals(result));     //判断q行l果是否与预期的相同
    }
}

  如果试一下equalsҎ(gu)Q用cM的代码,如下Q?BR>public class MoneyTest extends TestCase { //TestCase的子c?BR>    public void testEquals() { //把测试代码放在testEquals?BR>        Money m12CHF= new Money(12, "CHF"); //本行和下一行进行一些初始化
        Money m14CHF= new Money(14, "CHF");

        Assert.assertTrue(!m12CHF.equals(null));//q行不同情况的测?BR>        Assert.assertEquals(m12CHF, m12CHF);
        Assert.assertEquals(m12CHF, new Money(12, "CHF")); // (1)
        Assert.assertTrue(!m12CHF.equals(m14CHF));
    }
}


  当要同时q行试Add和equalsҎ(gu)Ӟ可以它们的各自的初始化工作Q合q到一赯行,形成试基础,用setUp初始化,用tearDown清除。如下:
public class MoneyTest extends TestCase {//TestCase的子c?BR>    private Money f12CHF;//提取公用的对?BR>    private Money f14CHF;   

    protected void setUp() {//初始化公用对?BR>        f12CHF= new Money(12, "CHF");
        f14CHF= new Money(14, "CHF");
    }
    public void testEquals() {//试equalsҎ(gu)的正?BR>        Assert.assertTrue(!f12CHF.equals(null));
        Assert.assertEquals(f12CHF, f12CHF);
        Assert.assertEquals(f12CHF, new Money(12, "CHF"));
        Assert.assertTrue(!f12CHF.equals(f14CHF));
    }
   
    public void testSimpleAdd() {//试addҎ(gu)的正?BR>        Money expected= new Money(26, "CHF");
        Money result= f12CHF.add(f14CHF);
        Assert.assertTrue(expected.equals(result));
    }
}


  以上三个中的Q一个TestCase子类代码保存到名为MoneyTest.java的文仉Qƈ在文仉行增?BR>import junit.framework.*;
Q都是可以运行的。关于Junitq行的问题很有意思,下面单独说明?BR>  上面释概念“测试基(fixture)”,引入了两个对两个Ҏ(gu)的测试。命令模式与集成模式的本质区别是Q前者一ơ只q行一个测试?BR>
集成模式
  利用TestSuite可以一个TestCase子类中所有test***()Ҏ(gu)包含q来一赯行,q可TestSuite子类也包含进来,从而行成了一U等U关pR可以把TestSuite视ؓ一个容器,可以盛放TestCase中的test***()Ҏ(gu)Q它自己也可以嵌套。这U体pL构,非常cM于现实中E序一步步开发一步步集成的现c?BR>  对上面的例子Q有代码如下Q?BR>public class MoneyTest extends TestCase {//TestCase的子c?BR>    ....
    public static Test suite() {//静态Test
        TestSuite suite= new TestSuite();//生成一个TestSuite
        suite.addTest(new MoneyTest("testEquals")); //加入试Ҏ(gu)
        suite.addTest(new MoneyTest("testSimpleAdd"));
        return suite;
    }
}

  从Junit2.0开始,有列LҎ(gu):
public class MoneyTest extends TestCase {//TestCase的子c?BR>    ....
    public static Test suite() {静态Test
        return new TestSuite(MoneyTest.class); //以类为参?BR>    }
}

  TestSuite见嵌套的例子Q在后面应用案例中有?BR>  

4、测试代码的q行
  先说最常用的集成模式?BR>  试代码写好以后Q可以相应的cM写mainҎ(gu)Q用java命o直接q行Q也可以不写mainҎ(gu)Q用Junit提供的运行器q行。Junit提供了textui,awtui和swingui三种q行器?BR>  以前面第2步中的AllTestsq行ZQ可有四U:

java junit.textui.TestRunner junit.samples.AllTests
java junit.awtui.TestRunner junit.samples.AllTests
java junit.swingui.TestRunner junit.samples.AllTests
java junit.samples.AllTests

  mainҎ(gu)中一般也都是单地用Runner调用suite()Q当没有mainӞTestRunner自己以运行的cMؓ参数生成了一个TestSuite.
  
  对于命o模式的运行,有两U方法?BR>
静态方?BR>
TestCase test= new MoneyTest("simple add") {
public void runTest() {
testSimpleAdd();
}
};


动态方?BR>
TestCase test= new MoneyTest("testSimpleAdd");

  我试了一下,好象有问题,哪位朋友成功了,hҎ(gu)一下。确实可以?BR>
import junit.framework.*;

public class MoneyTest extends TestCase {//TestCase的子c?BR>    private Money f12CHF;//提取公用的对?BR>    private Money f14CHF;   
    public MoneyTest(String name){
        super(name);
    }
    protected void setUp() {//初始化公用对?BR>        f12CHF= new Money(12, "CHF");
        f14CHF= new Money(14, "CHF");
    }
    public void testEquals() {//试equalsҎ(gu)的正?BR>        Assert.assertTrue(!f12CHF.equals(null));
        Assert.assertEquals(f12CHF, f12CHF);
        Assert.assertEquals(f12CHF, new Money(12, "CHF"));
        Assert.assertTrue(!f12CHF.equals(f14CHF));
    }
   
    public void testAdd() {//试addҎ(gu)的正?BR>        Money expected= new Money(26, "CHF");
        Money result= f12CHF.add(f14CHF);
        Assert.assertTrue(expected.equals(result));
    }
//    public static void main(String[] args) {
//        TestCase test=new MoneyTest("simple add") {
//                public void runTest() {
//                    testAdd();
//                }
//            };
//        junit.textui.TestRunner.run(test);
//    }
    public static void main(String[] args) {
        TestCase test=new MoneyTest("testAdd");
        junit.textui.TestRunner.run(test);
    }
}


再给一个静态方法用集成试的例子:
public static Test suite() {
    TestSuite suite= new TestSuite();
    suite.addTest(
        new testCar("getWheels") {
            protected void runTest() { testGetWheels(); }
        }
    );

    suite.addTest(
        new testCar("getSeats") {
            protected void runTest() { testGetSeats(); }
        }
    );
    return suite;
}


5、应用案?BR>

Junit Primer例程Q运行如下:
java com.hedong.JunitLearning.Primer.ShoppingCartTest


Ant+Junit+Mailto实现自动~译、调试ƈ发送结果的build.xml

JUnit实施,写得很棒Q理解也深刻。例E运行如下:
java com.hedong.JunitLearning.car.testCarNoJunit
java junit.swingui.TestRunner com.hedong.JunitLearning.car.testCar


Junit与log4jl合Q阿菜的例程q行Q?BR>cd acai
ant junit











6、一些问?BR>  有h在实践基上ȝZ些非常有价值的使用技巧,我没有经q一一“测试”,暂列在此?BR>
不要用TestCase的构造函数初始化FixtureQ而要用setUp()和tearDown()Ҏ(gu)?BR>
不要依赖或假定测试运行的序Q因为JUnit利用Vector保存?gu)试?gu)。所以不同的q_会按不同的顺序从Vector中取出测试方法。不?.8中是不是q是如此Q不q它提供的例子有一个是指定用VectorSuite的,如果不指定呢Q?BR>
避免~写有副作用的TestCase。例如:如果随后的测试依赖于某些特定的交易数据,׃要提交交易数据。简单的回滚可以了?BR>
当承一个测试类Ӟ记得调用父类的setUp()和tearDown()Ҏ(gu)?BR>
测试代码和工作代码攑֜一P一边同步编译和更新。(使用Ant中有支持junit的task.Q?BR>
试cd试Ҏ(gu)应该有一致的命名Ҏ(gu)。如在工作类名前加上test从而Ş成测试类名?BR>
保试与时间无养I不要依赖使用q期的数据进行测试。导致在随后的维护过E中很难重现试?BR>
如果你编写的软g面向国际市场Q编写测试时要考虑国际化的因素。不要仅用母语的Localeq行试?BR>
可能地利用JUnit提供地assert/failҎ(gu)以及异常处理的方法,可以使代码更为简z?BR>
试要尽可能地小Q执行速度快?BR>
把测试程序徏立在与被对象相同的包中

在你的原始代码目录中避免试码出玎ͼ可在一个源码镜像目录中放测试码

在自q应用E序包中包含一个TestSuite试c?BR>




7、相兌源下?BR>以下jar包,我只是做了打包、编译和调试的工作,供下载学习之用,相关的权利属于原作者?BR>
可运行例E?jar

Build.xml

阿菜的例E?BR>
Junit API 汉译(pdf)


8、未完成的Q?BR>

httpunit

cactus

Junit用链接池试


主要参考文献:



JUnit入門
[url]http://www.dotspace.twmail.org/Test/JUnit_Primer.htm[/url]

怎样使用Junit Frameworkq行单元试的编?BR>[url]http://www.chinaunix.net/bbsjh/14/546.html[/url]

Ant+Junit+Log4J+CVSq行XP模式开发的建立
[url]http://ejb.cn/modules/tutorials/printpage.php?tid=4[/url]

用HttpUnit试Web应用E序
[url]http://www.zdnet.com.cn/developer/code/story/0[/url],2000081534,39033726,00.htm

有没有用qCactus的,Web层的试是Cactusq是JUnitQ?BR>[url]http://www.jdon.com/jive/thread.jsp?forum=16&thread=9156[/url]

Ant+junit的测试自动化 biggieQ原作)
[url]http://www.csdn.net/Develop/article/19%5C19748.shtm[/url]

JUnit实施
[url]http://www.neweasier.com/article/2002-08-07/1028723459.html[/url]

JUnitTest Infected: Programmers Love Writing Tests
[url]http://junit.sourceforge.net/doc/testinfected/testing.htm[/url]

JUnit Cookbook
[url]http://junit.sourceforge.net/doc/cookbook/cookbook.htm[/url]

JUnit Primer
[url]http://www.itu.dk/~lthorup/JUnitPrimer.html[/url]

IBM DevelopWorks
[url]http://www-106.ibm.com/search/searchResults.jsp?query=junit&searchScope=dW&[/url]
searchType=1&searchSite=dWChina&pageLang=zh&langEncoding=gb2312&Search.x=0&
Search.y=0&Search=Search

黑石 2005-12-20 18:02 发表评论
]]>
JDOM使用详解及实例[转]http://www.aygfsteel.com/fjq639/archive/2005/12/20/24813.html黑石黑石Tue, 20 Dec 2005 08:20:00 GMThttp://www.aygfsteel.com/fjq639/archive/2005/12/20/24813.htmlhttp://www.aygfsteel.com/fjq639/comments/24813.htmlhttp://www.aygfsteel.com/fjq639/archive/2005/12/20/24813.html#Feedback0http://www.aygfsteel.com/fjq639/comments/commentRss/24813.htmlhttp://www.aygfsteel.com/fjq639/services/trackbacks/24813.html

一、JDOM?/P>

JDOM是一个开源项目,它基于树型结构,利用UJAVA的技术对XML文档实现解析、生成、序列化以及多种操作?/P>

JDOM直接为JAVA~程服务。它利用更ؓ强有力的JAVA语言的诸多特性(Ҏ(gu)重蝲、集合概念以及映)Q把SAX和DOM的功能有效地l合h?/P>

在用设计上可能地隐藏原来使用XMLq程中的复杂性。利用JDOM处理XML文档是一件轻松、简单的事?/P>

JDOM?000q的春天被BrettMcLaughlin和JasonHunter开发出来,以I补DOM及SAX在实际应用当中的不之处?/P>

q些不之处主要在于SAX没有文档修改、随问以及输出的功能Q而对于DOM来说QJAVAE序员在使用时来用v来总觉得不太方ѝ?/P>

DOM的缺点主要是来自于由于Dom是一个接口定义语aQIDLQ?它的d是在不同语言实现中的一个最低的通用标准Qƈ不是为JAVA特别设计的。JDOM的最新版本ؓJDOMBeta9。最qJDOM被收录到JSR-102内,q标志着JDOM成ؓ了JAVAq_l成的一部分?/P>

二、JDOM包概?/P>

JDOM是由以下几个包组成的
org.jdom               包含了所有的xml文档要素的javac?/P>

 

org.jdom.adapters        包含了与dom适配的javac?/P>

 

org.jdom.filter           包含了xml文档的过滤器c?/P>

 

org.jdom.input           包含了读取xml文档的类

 

org.jdom.output          包含了写入xml文档的类

 

org.jdom.transform       包含了将jdomxml文档接口转换为其他xml文档接口

 

org.jdom.xpath           包含了对xml文档xpath操作的类三、JDOMc说?/P>

1、org.JDOMq个包里的类是你J解析xml文g后所要用到的所有数据类型?/P>

Attribute

CDATA

Coment

DocType

Document

Element

EntityRef

Namespace

ProscessingInstruction

Text

2、org.JDOM.transform在涉及xslt格式转换时应使用下面?个类

JDOMSource

JDOMResult

org.JDOM.input

3、输入类Q一般用于文档的创徏工作

SAXBuilder

DOMBuilder

ResultSetBuilder

org.JDOM.output

4、输出类Q用于文档{换输?/P>

XMLOutputter

SAXOutputter

DomOutputter

JTreeOutputter

使用前注意事:

1.JDOM对于JAXP以及TRax的支?/P>

JDOM支持JAXP1.1Q你可以在程序中使用M的parser工具c?默认情况下是JAXP的parser?/P>

制定特别的parser可用如下形式

SAXBuilderparser

 =newSAXBuilder("org.apache.crimson.parser.XMLReaderImpl");

 Documentdoc=parser.build("http://www.cafeconleche.org/");

 //workwiththedocument...

JDOM也支持TRaXQXSLT可通过JDOMSource以及JDOMResultcL转换Q参见以后章节)

2.注意在JDOM里文档(DocumentQ类由org.JDOM.Document来表C。这要与org.w3c.dom中的Document区别开Q这2U格式如何{换在后面会说明?/P>

以下如无Ҏ(gu)均指JDOM里的Document?/P>

四、JDOM主要使用Ҏ(gu)

1.Ducumentc?/P>

(1)Document的操作方法:

Elementroot=newElement("GREETING");

Documentdoc=newDocument(root);

root.setText("HelloJDOM!");

或者简单的使用Documentdoc=newDocument(newElement("GREETING").setText("HelloJDOM!t"));

q点和DOM不同。Dom则需要更为复杂的代码Q如下:

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();

DocumentBuilderbuilder=factory.newDocumentBuilder();

Documentdoc=builder.newDocument();

Elementroot=doc.createElement("root");

Texttext=doc.createText("Thisistheroot");

root.appendChild(text);

doc.appendChild(root);

注意事项QJDOM不允许同一个节点同时被2个或多个文档相关联,要在W?个文档中使用原来老文档中的节点的话。首先需要用detach()把这个节点分开来?/P>

(2)从文件、流、系lID、URL得到Document对象Q?/P>

DOMBuilderbuilder=newDOMBuilder();

Documentdoc=builder.build(newFile("jdom_test.xml"));

SAXBuilderbuilder=newSAXBuilder();

Documentdoc=builder.build(url);

在新版本中DOMBuilder已经Deprecated掉DOMBuilder.builder(url)Q用SAX效率会比较快?/P>

q里举一个小例子Qؓ了简单v见,使用String对象直接作ؓxml数据源:

 publicjdomTest(){

   StringtextXml=null;

   textXml="<note>";

   textXml=textXml+

       "<to>aaa</to><from>bbb</from><heading>ccc</heading><body>ddd</body>";

   textXml=textXml+"</note>";

   SAXBuilderbuilder=newSAXBuilder();

   Documentdoc=null;

   Readerin=newStringReader(textXml);

   try{

     doc=builder.build(in);

     Elementroot=doc.getRootElement();

     Listls=root.getChildren();//注意此处取出的是root节点下面的一层的Element集合

     for(Iteratoriter=ls.iterator();iter.hasNext();){

       Elementel=(Element)iter.next();

       if(el.getName().equals("to")){

        System.out.println(el.getText());

       }

     }

   }

   catch(IOExceptionex){

     ex.printStackTrace();

   }

   catch(JDOMExceptionex){

     ex.printStackTrace();

   }

 }

(3)DOM的document和JDOM的Document之间的相互{换用方法,单!

DOMBuilderbuilder=newDOMBuilder();

org.jdom.DocumentjdomDocument=builder.build(domDocument);

DOMOutputterconverter=newDOMOutputter();//workwiththeJDOMdocument?/P>

org.w3c.dom.DocumentdomDocument=converter.output(jdomDocument);

//workwiththeDOMdocument?/P>

2.XML文档输出

XMLOutPutterc:

JDOM的输出非常灵z?支持很多Uio格式以及风格的输?/P>

Documentdoc=newDocument(...);

XMLOutputteroutp=newXMLOutputter();

outp.output(doc,fileOutputStream);//Rawoutput

outp.setTextTrim(true);//Compressedoutput

outp.output(doc,socket.getOutputStream());

outp.setIndent("");//Prettyoutput

outp.setNewlines(true);

outp.output(doc,System.out);

详细请参阅最新的JDOMAPI手册

3.Elementc:

(1)览Element?/P>

Elementroot=doc.getRootElement();//获得根元素element

ListallChildren=root.getChildren();//获得所有子元素的一个list

ListnamedChildren=root.getChildren("name");//获得指定名称子元素的list

Elementchild=root.getChild("name");//获得指定名称的第一个子元素

JDOMl了我们很多很灵zȝ使用Ҏ(gu)来管理子元素Q这里的List是java.util.ListQ?/P>

ListallChildren=root.getChildren();

allChildren.remove(3);//删除W四个子元素

allChildren.removeAll(root.getChildren("jack"));//删除叫“jack”的子元?/P>

root.removeChildren("jack");//便捷写法

allChildren.add(newElement("jane"));//加入

root.addContent(newElement("jane"));//便捷写法

allChildren.add(0,newElement("first"));

(2)UdElements:

在JDOM里很?/P>

Elementmovable=newElement("movable");

parent1.addContent(movable);//place

parent1.removeContent(movable);//remove

parent2.addContent(movable);//add

在Dom?/P>

Elementmovable=doc1.createElement("movable");

parent1.appendChild(movable);//place

parent1.removeChild(movable);//remove

parent2.appendChild(movable);//出错!

补充Q纠错?/P>

JDOM的Element构造函敎ͼ以及它的其他函数Q会查element是否合法?/P>

而它的add/removeҎ(gu)会检查树l构Q检查内容如下:

1.在Q何树中是否有回环节点

2.是否只有一个根节点

3.是否有一致的命名I间QNamespacesQ?/P>

(3)Element的text内容d

<description>

Acooldemo

</description>

//Thetextisdirectlyavailable

//Returns"\nAcooldemo\n"

Stringdesc=element.getText();

//There'saconvenientshortcut

//Returns"Acooldemo"

Stringdesc=element.getTextTrim();

(4)Elment内容修改

element.setText("Anewdescription");

3.可正解释特D字W?/P>

element.setText("<xml>content");

4.CDATA的数据写入、读?/P>

element.addContent(newCDATA("<xml>content"));

StringnoDifference=element.getText();

混合内容

element可能包含很多U内容,比如?/P>

<table>

<!--Somecomment-->

Sometext

<tr>Somechildelement</tr>

</table>

取table的子元素tr

Stringtext=table.getTextTrim();

Elementtr=table.getChild("tr");

也可使用另外一个比较简单的Ҏ(gu)

ListmixedCo=table.getContent();

Iteratoritr=mixedCo.iterator();

while(itr.hasNext()){

Objecto=i.next();

if(oinstanceofComment){...}

//q里可以写成Comment,Element,Text,CDATA,ProcessingInstruction,或者是EntityRef的类?/P>

}

//现在U除Comment,注意q里游标应ؓ1。这是由于回车键也被解析成Textcȝ~故,所以Comment应??/P>

mixedCo.remove(1);

4.Attributec?/P>

<tablewidth="100%"border="0"></table>

Stringwidth=table.getAttributeValue("width");//获得attribute

intborder=table.getAttribute("width").getIntValue();

table.setAttribute("vspace","0");//讄a(chn)ttribute

table.removeAttribute("vspace");//删除一个或全部attribute

table.getAttributes().clear();

5.处理指o(ProcessingInstructions)操作

一个Pls的例?/P>

<?br?>

<?cocoon-processtype="xslt"?>

         |       |

         |       |

       目标    数据

处理目标名称(Target)

Stringtarget=pi.getTarget();

获得所有数据(dataQ,在目标(targetQ以后的所有数据都会被q回?/P>

Stringdata=pi.getData();

Stringtype=pi.getValue("type");获得指定属性的数据

Listls=pi.getNames();获得所有属性的名称

6.命名I间操作

<xhtml:html

 xmlns:xhtml="http://www.w3.org/1999/xhtml">

<xhtml:title>HomePage</xhtml:title>

</xhtml:html>

Namespacexhtml=Namespace.getNamespace("xhtml","http://www.w3.org/1999/xhtml");

Listkids=html.getChildren("title",xhtml);

Elementkid=html.getChild("title",xhtml);

kid.addContent(newElement("table",xhtml));

7.XSLT格式转换

使用以下函数可对XSLT转换

最后如果你需要用w3c的Document则需要{换一下?/P>

publicstaticDocumenttransform(StringstylesheetQDocumentin)

                                       throwsJDOMException{

    try{

      Transformertransformer=TransformerFactory.newInstance()

                            .newTransformer(newStreamSource(stylesheet));

      JDOMResultout=newJDOMResult();

      transformer.transform(newJDOMSource(in),out);

      returnout.getDeocument();

    }

    catch(TransformerExceptione){

      thrownewJDOMException("XSLTTrandformationfailed",e);

    }

  }

五、用?

1、生成xml文档Q?/P>

 

 

publicclassWriteXML{

   publicvoidBuildXML()throwsException{

       Elementroot,student,number,name,age;        

       root=newElement("student-info");//生成根元素:student-info

       student=newElement("student");//生成元素Qstudent(number,name,age)                            

       number=newElement("number");

       name=newElement("name");

       age=newElement("age");

       Documentdoc=newDocument(root);//根元素植入文档doc?/P>

       number.setText("001");

       name.setText("lnman");

       age.setText("24");

       student.addContent(number);

       student.addContent(name);

       student.addContent(age);

       root.addContent(student);

       Formatformat=Format.getCompactFormat();

       format.setEncoding("gb2312");//讄xml文g的字Wؓgb2312

       format.setIndent("   ");//讄xml文g的羃qؓ4个空?/P>

       XMLOutputterXMLOut=newXMLOutputter(format);//元素后换行一层元素羃四格

       XMLOut.output(doc,newFileOutputStream("studentinfo.xml")); 

}

   publicstaticvoidmain(String[]args)throwsException{

       WriteXMLw=newWriteXML();

       System.out.println("NowwebuildanXMLdocument.....");

       w.BuildXML();

       System.out.println("finished!");

}

}

生成的xml文档为:

<?xmlversion="1.0"encoding="gb2312"?>

<student-info>

   <student>

       <number>001</number>

       <name>lnman</name>

       <age>24</age>

   </student>

</student-info>

 

 

创徏XML文档2Q?/P>

 publicclassCreateXML{

 publicvoidCreate(){

  try{

   Documentdoc=newDocument();  

   ProcessingInstructionpi=newProcessingInstruction("xml-stylesheet","type="text/xsl"href="test.xsl"");

   doc.addContent(pi);   

   Namespacens=Namespace.getNamespace("http://www.bromon.org");

   Namespacens2=Namespace.getNamespace("other","http://www.w3c.org");

   Elementroot=newElement("根元?,ns);

   root.addNamespaceDeclaration(ns2);

   doc.setRootElement(root);

   Elementel1=newElement("元素一");

   el1.setAttribute("属?,"属性一");   

   Texttext1=newText("元素?);

            Elementem=newElement("元素?).addContent("W二个元?);

   el1.addContent(text1);

            el1.addContent(em);            

            Elementel2=newElement("元素?).addContent("W三个元?);

            root.addContent(el1);

            root.addContent(el2);            

            //~进四个I格,自动换行,gb2312~码

            XMLOutputteroutputter=newXMLOutputter(" ",true,"GB2312");

            outputter.output(doc,newFileWriter("test.xml"));

        }catch(Exceptione) {

         System.out.println(e);

        }

    }    

    publicstaticvoidmain(Stringargs[]){

     newCreateXML().Create();

    }    

 }

2、读取xml文档的例子:

importorg.jdom.output.*;

importorg.jdom.input.*;

importorg.jdom.*;

importjava.io.*;

importjava.util.*;

publicclassReadXML{

   publicstaticvoidmain(String[]args)throwsException{

       SAXBuilderbuilder=newSAXBuilder();

       Documentread_doc=builder.build("studentinfo.xml");

       Elementstu=read_doc.getRootElement();

       Listlist=stu.getChildren("student");

       for(inti=0;i<list.size();i++){

           Elemente=(Element)list.get(i);

           Stringstr_number=e.getChildText("number");

           Stringstr_name=e.getChildText("name");

           Stringstr_age=e.getChildText("age");

           System.out.println("---------STUDENT--------------");

           System.out.println("NUMBER:"+str_number);

           System.out.println("NAME:"+str_name);

           System.out.println("AGE:"+str_age);

           System.out.println("------------------------------");

           System.out.println();

       } 

      }

}

3、DTD验证的:

 publicclassXMLWithDTD{

 publicvoidvalidate() {

  try{

   SAXBuilderbuilder=newSAXBuilder(true);

   builder.setFeature("http://xml.org/sax/features/validation";,true);

   Documentdoc=builder.build(newFileReader("author.xml"));   

   System.out.println("搞掂");

   XMLOutputteroutputter=newXMLOutputter();

   outputter.output(doc,System.out);

  }catch(Exceptione){

   System.out.println(e);

  }  

 }

 publicstaticvoidmain(Stringargs[]){

  newXMLWithDTD().validate();

 } 

 }

 需要说明的是,q个E序没有指明使用哪个DTD文g。DTD文g的位|是在XML中指定的Q而且DTD不支持命名空_一个XML只能引用一个DTDQ所以程序直接读取XML中指定的DTDQ程序本w不用指定。不q这样一来,好象只能用外部式的DTD引用方式了?高h指点?/P>

 

 

4、XMLSchema验证的:

 publicclassXMLWithSchema{

 Stringxml="test.xml";

 Stringschema="test-schema.xml";

 publicvoidvalidate(){

  try{

   SAXBuilderbuilder=newSAXBuilder(true);

   //指定U束方式为XMLschema

   builder.setFeature("http://apache.org/xml/features/validation/schema";, true);

   //导入schema文g

builder.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation";,schema);

   Documentdoc=builder.build(newFileReader(xml));   

   System.out.println("搞掂");

   XMLOutputteroutputter=newXMLOutputter();

   outputter.output(doc,System.out);

  }catch(Exceptione){

   System.out.println("验证p|:"+e);

  } 

 }

 }

 上面的程序就指出了要引入的XMLSchema文g的位|?/P>

 

 

 pȝ默认输出是UTF-8Q这有可能导致出Cؕ码?/P>

5、Xpath例子Q?/P>

JDOM的关于XPATH的api在org.jdom.xpathq个包里。这个包下,有一个抽象类XPath.java和实现类JaxenXPath.javaQ用时先用XPathcȝ静态方法newInstance(Stringxpath)得到XPath对象Q然后调用它的selectNodes(Objectcontext)Ҏ(gu)或selectSingleNode(Objectcontext)Ҏ(gu)Q前者根据xpath语句q回一l节?List对象)Q后者根据一个xpath语句q回W合条g的第一个节?Objectcd)。请看jdom-1.0自带的范例程序:

    它分析在web.xml文g中的注册的servlet的个数及参数个数Qƈ输出角色名?/P>

web.xml文gQ?/P>

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!--

<!DOCTYPEweb-app

   PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.2//EN"

   "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">

-->

<web-app>

   <servlet>

       <servlet-name>snoop</servlet-name>

       <servlet-class>SnoopServlet</servlet-class>

   </servlet>

   <servlet>

       <servlet-name>file</servlet-name>

       <servlet-class>ViewFile</servlet-class>

       <init-param>

           <param-name>initial</param-name>

           <param-value>1000</param-value>

           <description>Theinitialvalueforthecounter <!--optional--></description>

       </init-param>

   </servlet>

   <servlet-mapping>

       <servlet-name>mv</servlet-name>

       <url-pattern>*.wm</url-pattern>

   </servlet-mapping>

   <distributed/>

   <security-role>

     <role-name>manager</role-name>

     <role-name>director</role-name>

     <role-name>president</role-name>

   </security-role>

</web-app>

处理E序Q?/P>

importjava.io.*;

importjava.util.*; 

publicclassXPathReader{     

   publicstaticvoidmain(String[]args)throwsIOException,JDOMException{

       if(args.length!=1){

           System.err.println("Usage:javaXPathReaderweb.xml");

           return;

       }

       Stringfilename=args[0];//从命令行输入web.xml

       PrintStreamout=System.out;

       SAXBuilderbuilder=newSAXBuilder();

       Documentdoc=builder.build(newFile(filename));//得到Document对象

 

 

       //Printservletinformation

       XPathservletPath=XPath.newInstance("http://servlet");//,选择L路径下servlet元素

       Listservlets=servletPath.selectNodes(doc);//q回所有的servlet元素?/P>

       out.println("ThisWARhas"+servlets.size()+"registeredservlets:");

       Iteratori=servlets.iterator();

       while(i.hasNext()){//输出servlet信息

           Elementservlet=(Element)i.next();

           out.print("\t"+servlet.getChild("servlet-name")

                                   .getTextTrim()+

                     "for"+servlet.getChild("servlet-class")

                                      .getTextTrim());

           ListinitParams=servlet.getChildren("init-param");

           out.println("(ithas"+initParams.size()+"initparams)"); 

       }             

       //Printsecurityroleinformation

       XPathrolePath=XPath.newInstance("http://security-role/role-name/text()");

       ListroleNames=rolePath.selectNodes(doc);//得到所有的角色?/P>

       if(roleNames.size()==0){

           out.println("ThisWARcontainsnoroles");

       }else{

           out.println("ThisWARcontains"+roleNames.size()+"roles:");

           i=roleNames.iterator();

           while(i.hasNext()){//输出角色?/P>

               out.println("\t"+((Text)i.next()).getTextTrim());

           }

       }

   }    

}

 

 

输出l果:

C:\java>java  XPathReaderweb.xml

ThisWARhas2registeredservlets:

       snoopforSnoopServlet(ithas0initparams)

       fileforViewFile(ithas1initparams)

ThisWARcontains3roles:

       manager

       director

       president

 

 

6、数据输入要用到XML文档要通过org.jdom.input包,反过来需要org.jdom.output。如前面所_x看API文档p够用?/P>

我们的例子读入XML文gexampleA.xmlQ加入一条处理指令,修改W一本书的h(hun)格和作者,q添加一条属性,然后写入文gexampleB.xmlQ?/P>

//exampleA.xml

<?xmlversion="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

importorg.jdom.*;

importorg.jdom.output.*;

importorg.jdom.input.*;

importjava.io.*;

publicclassTestJDOM{

publicstaticvoidmain(Stringargs[])throwsException{

SAXBuildersb=newSAXBuilder();

//从文件构造一个DocumentQ因为XML文g中已l指定了~码Q所以这里不必了

Documentdoc=sb.build(newFileInputStream("exampleA.xml"));

ProcessingInstructionpi=newProcessingInstruction//加入一条处理指?/P>

("xml-stylesheet","href=\"bookList.html.xsl\"type=\"text/xsl\"");

doc.addContent(pi);

Elementroot=doc.getRootElement();//得到根元?/P>

java.util.Listbooks=root.getChildren();//得到根元素所有子元素的集?/P>

Elementbook=(Element)books.get(0);//得到W一个book元素

//为第一本书d一条属?/P>

Attributea=newAttribute("hot","true");

book.setAttribute(a);

Elementauthor=book.getChild("author");//得到指定的字元素

author.setText("王五");//作者改为王?/P>

//或Textt=newText("王五");book.addContent(t);

Elementprice=book.getChild("price");//得到指定的字元素

//修改hQ比较郁L是我们必自p{换数据类型,而这正是JAXB的优?/P>

author.setText(Float.toString(50.0f));

Stringindent="";

booleannewLines=true;

XMLOutputteroutp=newXMLOutputter(indent,newLines,"GBK");

outp.output(doc,newFileOutputStream("exampleB.xml"));

}

};

执行l果exampleB.xmlQ?/P>

<?xmlversion="1.0"encoding="GBK"?>

<bookList>

<bookhot=”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-stylesheethref="bookList.html.xsl"type="text/xsl"?>

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



黑石 2005-12-20 16:20 发表评论
]]>
jdom学习:dxml文ghttp://www.aygfsteel.com/fjq639/archive/2005/12/20/24806.html黑石黑石Tue, 20 Dec 2005 08:01:00 GMThttp://www.aygfsteel.com/fjq639/archive/2005/12/20/24806.htmlhttp://www.aygfsteel.com/fjq639/comments/24806.htmlhttp://www.aygfsteel.com/fjq639/archive/2005/12/20/24806.html#Feedback0http://www.aygfsteel.com/fjq639/comments/commentRss/24806.htmlhttp://www.aygfsteel.com/fjq639/services/trackbacks/24806.html  
官方|站:http://www.jdom.org/downloads/index.html
      用JDOMdXML文g需先用org.jdom.input.SAXBuilder对象的build()Ҏ(gu)创徏Document对象,然后用DocumentcRElementcȝ的方法读取所需的内宏VIBM : developerWorks 中国站上有一个很好的例子Q?
<?xml version="1.0" encoding="UTF-8"?>
<HD>
  <disk name="C">
    <capacity>8G</capacity>
    <directories>200</directories>
    <files>1580</files>
  </disk>

  <disk name="D">
    <capacity>10G</capacity>
    <directories>500</directories>
    <files>3000</files>
  </disk>
</HD>

上面的sample.xml文档Q描qC某台?sh)脑中硬盘的基本信?根节?lt;HD>代表盘Q?lt;disk>标签代表盘分区Q从它的name属性可以看出有两个盘符名称?C"?D"的分区;每个分区下都包含<capacity>,<directories><files>三个节点Q分别代表了分区的空间大、目录数量、所含文件个?

下面的程序读取此文g中的信息Q?
import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
public class Sample1 {
  public static void main(String[] args) throws Exception{ 
    SAXBuilder sb=new SAXBuilder();
    Document doc=sb.build("sample.xml"); //构造文档对?BR>    Element root=doc.getRootElement(); //获取根元?BR>    List list=root.getChildren("disk");//取名字ؓdisk的所有元?
    for(int i=0;i<list.size();i++){
       Element element=(Element)list.get(i);
       String name=element.getAttributeValue("name");
       String capacity=element.getChildText("capacity");//取disk子元素capacity的内?
       String directories=element.getChildText("directories");
       String files=element.getChildText("files");
       System.out.println("盘信息:");
       System.out.println("分区盘符:"+name);
       System.out.println("分区定w:"+capacity);
       System.out.println("目录?"+directories);
       System.out.println("文g?"+files);
       System.out.println("-----------------------------------");
    }  
  }
}
q行l果Q?
C:\java>java   Sample1
盘信息:
分区盘符:C
分区定w:8G
目录?200
文g?1580
-----------------------------------
盘信息:
分区盘符:D
分区定w:10G
目录?500
文g?3000
-----------------------------------

黑石 2005-12-20 16:01 发表评论
]]>
Hibernate学习http://www.aygfsteel.com/fjq639/archive/2005/12/19/24635.html黑石黑石Mon, 19 Dec 2005 06:48:00 GMThttp://www.aygfsteel.com/fjq639/archive/2005/12/19/24635.htmlhttp://www.aygfsteel.com/fjq639/comments/24635.htmlhttp://www.aygfsteel.com/fjq639/archive/2005/12/19/24635.html#Feedback0http://www.aygfsteel.com/fjq639/comments/commentRss/24635.htmlhttp://www.aygfsteel.com/fjq639/services/trackbacks/24635.html    参考书c?/FONT>:深入除Hibernate

     ?nbsp;     ?/FONT>:夏昕 Ҏ(gu)?唐勇



   



黑石 2005-12-19 14:48 发表评论
]]>
վ֩ģ壺 | | | | ƽ| ʳ| | | | | | | IJ| | | | | | ˹| | ɯ| | | | | żҿ| | | ֶ| | ˮ| ٲ| | | | | ³ľ| | ԭ| ʹ| |