使用JOX实现JavaBean和XML之间的转化

以前不知道有JOX这个包,通过这个包可以很方便的实现XML和JAVABean之间的转化,下面是官网的实例代码,很简单的api一看就会用。
package com.wutka.jox.test;

import com.wutka.jox.*;
import java.util.*;

public class TestBean implements java.io.Serializable
{
    protected int foo;
    protected String bar;
    protected java.util.Date baz;
    protected Vector thingies;
    protected TestSubbean subbean;

    public TestBean()
    {
        bar = "";
        baz = new Date();
        thingies = new Vector();
    }

    public int getFoo() { return foo; }
    public void setFoo(int aFoo) { foo = aFoo; }

    public String getBar() { return bar; }
    public void setBar(String aBar) { bar = aBar; }

    public java.util.Date getBaz() { return baz; }
    public void setBaz(java.util.Date aBaz) { baz = aBaz; }

    public TestSubbean getSub() { return subbean; }
    public void setSub(TestSubbean aSub) { subbean = aSub; }

    public String[] getThingies()
    {
        String[] retThingies = new String[thingies.size()];
        if (thingies.size() > 0) thingies.copyInto(retThingies);

        return retThingies;
    }

    public void setThingies(String[] newThingies)
    {
        thingies = new Vector(newThingies.length);
        for (int i=0; i < newThingies.length; i++)
        {
            thingies.addElement(newThingies[i]);
        }
    }

    public String getThingies(int i)
    {
        return (String) thingies.elementAt(i);
    }

    public void setThingies(int i, String thingy)
    {
        thingies.setElementAt(thingy, i);
    }

    public String toString()
    {
        StringBuffer ret = new StringBuffer(
            "foo="+foo+";bar="+bar+";baz="+baz.toString()+
            ";thingies=");
        for (int i=0; i < thingies.size(); i++)
        {
            if (i > 0) ret.append(",");
            ret.append((String) thingies.elementAt(i));
        }

        ret.append(";sub=");
        ret.append(subbean.toString());

        return ret.toString();
    }
}

and you have the following XML file:

<?xml version="1.0"?>
<MarkTest>
<thingies>Moe</thingies>
<thingies>Larry</thingies>
<thingies>Curly</thingies>
<thingies>Shemp</thingies>
<thingies>Curly Joe</thingies>
<foo>5</foo>
<baz>6/25/00 12:46 AM</baz>
<bar>This is the bar value</bar>
<sub>
<age>35</age>
<name>Mark</name>
</sub>
</MarkTest>

The following program reads in the XML file and stores its values into TestBean:

package com.wutka.jox.test;

import com.wutka.jox.*;
import java.io.*;

public class TestDeser
{
    public static void main(String[] args)
    {
        try
        {
            FileInputStream in = new FileInputStream("bean.xml");

            JOXBeanInputStream joxIn = new JOXBeanInputStream(in);

            TestBean testBean = (TestBean) joxIn.readObject(
                TestBean.class);

            System.out.println(testBean);
        }
        catch (Exception exc)
        {
            exc.printStackTrace();
        }
    }
}

All you do is create a FileInputStream or FileReader to read the XML file and wrap a JOXBeanInputStream or JOXBeanReader around the file stream. Then you tell JOX to read an object and tell it the class of the object.

Writing a bean out to XML is just as easy:

package com.wutka.jox.test;

import com.wutka.jox.*;
import java.io.*;

public class TestSer
{
    public static void main(String[] args)
    {
        try
        {
            TestBean b = new TestBean();
            b.setFoo(5);
            b.setBar("This is the bar value");
            b.setThingies(new String[] {
                "Moe", "Larry", "Curly", "Shemp", "Curly Joe" });
            TestSubbean sub = new TestSubbean();
            sub.setName("Mark");
            sub.setAge(35);
            b.setSub(sub);

            FileOutputStream fileOut = new FileOutputStream("bean.xml");
            JOXBeanOutputStream joxOut = new JOXBeanOutputStream(fileOut);

            joxOut.writeObject("MarkTest", b);

            joxOut.close();
        }
        catch (Exception exc)
        {
            exc.printStackTrace();
        }
    }
}

You just put some values in the bean, create an output stream for writing the XML, slap a JOXBeanOutputStream or JOXBeanWriter around the output stream and write the object. Notice that you need to put the root tag name for the XML file when you write out the XML. In the future, you won't have to do this if you have a DTD and JOX can figure out the root tag from the DTD.

For a final example, assume you have the following DTD:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!ELEMENT MarkTest (Thingies*, foo?, BAR?, baz? S-U-B?)>

<!ELEMENT Thingies #PCDATA>
<!ELEMENT foo #PCDATA>
<!ELEMENT BAR #PCDATA>
<!ELEMENT baz #PCDATA>
<!ELEMENT S-U-B (age)>
<!ELEMENT age #PCDATA>
<!ATTLIST S-U-B
    name CDATA "">

The following program reads in the DTD and passes it to JOX to help JOX format the output:

package com.wutka.jox.test;

import com.wutka.jox.*;
import com.wutka.jox.dtd.*;
import java.io.*;

public class TestSerDTD
{
    public static void main(String[] args)
    {
        try
        {
            TestBean b = new TestBean();
            b.setFoo(5);
            b.setBar("This is the bar value");
            b.setThingies(new String[] {
                "Moe", "Larry", "Curly", "Shemp", "Curly Joe" });
            TestSubbean sub = new TestSubbean();
            sub.setName("Mark");
            sub.setAge(35);
            b.setSub(sub);

            FileOutputStream fileOut = new FileOutputStream("bean.xml");

            FileReader reader = new FileReader("testbean.dtd");
            Parser dtdParser = new Parser();

            DTD dtd = dtdParser.parse(reader);
            reader.close();

            JOXBeanOutputStream joxOut = new JOXBeanOutputStream(dtd, fileOut);

            joxOut.writeObject("MarkTest", b);

            joxOut.close();
        }
        catch (Exception exc)
        {
            exc.printStackTrace();
        }
    }
}
posted @ 2009-07-26 22:30  yiling  阅读(867)  评论(0编辑  收藏  举报