JOX Documentation
The Javadoc API documentation is available in the JOX distribution, or you can view it online here.
The Quick & Dirty JOX Tutorial
JOX is extremely easy to use. Assume you have the following Java Bean with several properties including an indexed property and a property whose value is another object.
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(); }
}
}