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

Reply via email to