I am trying to create Java objects from XML files I have no control over. I am
close to having the code working with just one annoying problem left to solve
that involves getting the value of an attribute. Here is a sample of the XML I
am working with:
<objects>
<object User="skippy">
<value1>VALUE01</value1>
<value2>VALUE02</value2>
<value3>VALUE03</value3>
<value4>VALUE04</value4>
<objectitem>
<desc>A thing</desc>
<pnumber>X12345678</pnumber>
<quantity>01</quantity>
<stuff id="L">STUFF1</stuff>
</objectitem>
</object>
<object User="juanita">
<value1>VALUE10</value1>
<value2>VALUE20</value2>
<value3>VALUE30</value3>
<value4>VALUE40</value4>
<objectitem>
<desc>A different thing</desc>
<pnumber>Z87654321</pnumber>
<quantity>99</quantity>
<stuff id="Q">STUFF2</stuff>
</objectitem>
</object>
</objects>
My problem is within <objectitem> and getting the "id" attribute from <stuff>.
I've tried "reversing" the process and creating XML from Java objects and I am
"close" but I can't seem to match the XML I need to work with. Here is the
code I am using to create both the XML and Java objects in the hopes of
matching the above XML. Below that is the XML I am actually generating.
import java.io.File;
import java.util.*;
import com.thoughtworks.xstream.XStream;
public class TestXMLCreator {
public static void main(String[] args) {
XStream xstream = new XStream();
xstream.processAnnotations(TestObjects.class);
ArrayList<TestObject> tests = new
ArrayList<TestObject>();
xstream.useAttributeFor(TestObject.class,
"User");
xstream.useAttributeFor(TestObjectStuff.class,
"id");
/*
xstream.useAttributeFor(TestObjectItem.class,
"id");
void useAttributeFor(Class definedIn, String fieldName)
void useAttributeFor(String fieldName, Class type)
xstream.aliasField("stuff",
TestObjectItem.class, "id");
*/
xstream.alias("object", TestObject.class);
TestObject test = new TestObject();
test.setValue1("VAL1");
test.setValue2("VAL2");
test.setValue3("VAL3");
test.setValue4("VAL4");
test.setUser("YAMUTHA");
test.setTestObjectItem(new
TestObjectItem("DESC1", "123456789", "99", "STUFF1", "1"));
tests.add(test);
test = new TestObject();
test.setValue1("VAL10");
test.setValue2("VAL20");
test.setValue3("VAL30");
test.setValue4("VAL40");
test.setUser("YAGRANMUTHA");
test.setTestObjectItem(new
TestObjectItem("DESC2", "234567890", "100", "STUFF2", "2"));
tests.add(test);
xstream.addImplicitCollection(TestObjects.class, "items");
String testxml = xstream.toXML(tests);
System.out.println(testxml);
System.out.println();
List beans =
(ArrayList)xstream.fromXML(testxml);
TestObject bean = null;
for(int idx = 0; idx < beans.size(); idx++){
bean =
(TestObject)beans.get(idx);
System.out.println(" DESC " +
bean.getTestObjecItem().getDesc());
System.out.println(" PNUM " +
bean.getTestObjecItem().getPnumber());
System.out.println(" QTY " +
bean.getTestObjecItem().getQuantity());
System.out.println("STUFF " +
bean.getTestObjecItem().getStuff().getStuff());
System.out.println(" ID " +
bean.getTestObjecItem().getStuff().getId());
System.out.println(" VAL1 = " +
bean.getValue1() +
", VAL2 = " + bean.getValue2() +
", VAL3 = " + bean.getValue3() +
", VAL4 = " + bean.getValue4() +
", USER = " + bean.getUser());
System.out.println();
}
}
}
<list>
<object User="YAMUTHA">
<objectitem>
<desc>DESC1</desc>
<pnumber>123456789</pnumber>
<quantity>99</quantity>
<stuff id="1">
<stuff>STUFF1</stuff>
</stuff>
</objectitem>
<value1>VAL1</value1>
<value2>VAL2</value2>
<value3>VAL3</value3>
<value4>VAL4</value4>
</object>
<object User="YAGRANMUTHA">
<objectitem>
<desc>DESC2</desc>
<pnumber>234567890</pnumber>
<quantity>100</quantity>
<stuff id="2">
<stuff>STUFF2</stuff>
</stuff>
</objectitem>
<value1>VAL10</value1>
<value2>VAL20</value2>
<value3>VAL30</value3>
<value4>VAL40</value4>
</object>
</list>
I guess one final question would be, how do I get rid of the root tag as "list"
and change it to "objects"? But that I do not consider important, just more of
a curiosity at this point.
Thank you,
Greg Sliker