Hi Paul, This is actually working as expected :) I just spaced and missed it the first time around.
try something like: BusinessDescription.Contact contact = BusinessDescription.Contact.Factory.newInstance(); contact.setAddress(address); businessDescription.setContact(contact); Its the difference between copy and reference in java. A simpler example: String a = "1"; String b = a; //b actually has the same memory address as a a = "2"; // the memory address for a and b are now different The same is happening in your use of the API. businessDescription.setContact(contact) does not maintain the reference to the contact object once it changes because it is now a 'new' object. The addNewXXX() works differently. If you take a peek at the java source (scomp -src <dir> yourXSDs) things should get a little clearer :) Hope this helps, -jacobd On Jan 11, 2008 2:11 PM, Paul French <[EMAIL PROTECTED]> wrote: > Thanks for the reply I really appreciate your help. > > I understand what you say about the > BusinessDescription.Contact.Factory.newInstance() creating an unassociated > contact. Hence I assume you can associate it to a BusinessDescription > instance by calling > > businessDescription.setContact(contact) > > Now if I add additional properties to the contact e.g contact.setXXXX they > cannot be seen by calling > > businessDescription.getContact().getXXXX > > The schemas are public ones so I have attached them. Look at the > BusinessDescription_v3_1.xsd schema. I looked at sending a small snippet but > couldn't see how.... > > Have a good weekend!! > > > ------------------------------ > *From:* Jacob Danner [mailto:[EMAIL PROTECTED] > *Sent:* 11 January 2008 18:56 > > *To:* [email protected] > *Subject:* Re: [newbie] difference between addNew and (Factory.newInstance+ > set) > > Thought I should take a crack at the question in the subject line real > quick. > > The differences in addNew versus newInstance is that addNew is adding the > type to an existing element. The newInstance is just that, a brand new > instance, not attached to anything. > In your case below, addNewContact() is being called on the > BusinesDescription Class, which adds a new ContactType to the > BusinessDescription > BusinessDescription.Contact contact = businessDescription.addNewContact > (); > > In the Factory.newInstance > BusinessDescription.Contact contact = > BusinessDescription.Contact.Factory.newInstance(); > a new Type is create that is NOT associated with the BusinessDescription > element that 'encloses/wraps' the contact type in the schema.In schema-ish > terms, the contact type is local to the BusinessDescription element. > When contact is used like it is above, it will be wrapped by <xml-fragment > /> because it is not associated with an element. > > In simple terms, thats how I know those API to work, and the differences > between them. > > The addNewXXX() methods exist because of the way the schema is defined, so > not all the schemas you may work with will have this structure. > Does this help you understanding? > > As to why, one usage returns null and the other one does not, I'm not > sure. I'm curious how things might be defined in your XSD. Can you give us a > peek at a schema snippet? > > Thanks, > -jacobd > > > On Jan 11, 2008 10:23 AM, Paul French <[EMAIL PROTECTED]> wrote: > > > The Address has it's own type and is imported into the main schema via > > another schema. > > > > I did as you said: > > > > BusinessDescription.Contact contact = businessDescription.addNewContact > > (); > > contact.setAddress(address); > > > > contact.xmlText() or businessDescription.getContact().xmlText() gives > > > > <rol:BS7666Address xmlns:rol=" > > http://www.rol.co.uk"><bs7:AdministrativeArea > > xmlns:bs7="http://www.govtalk.gov.uk/people/bs7666">TEST</bs7:AdministrativeArea></rol:BS7666Address > > > > <http://www.govtalk.gov.uk/people/bs7666%22%3ETEST%3C/bs7:AdministrativeArea%3E%3C/rol:BS7666Address> > > > > > However for: > > > > BusinessDescription.Contact contact = > > BusinessDescription.Contact.Factory.newInstance(); > > businessDescription.setContact(contact); > > contact.setAddress(address); > > > > contact.xmlText() gives > > > > <rol:BS7666Address xmlns:rol="http://www.rol.co.uk"><bs7:AdministrativeArea > > xmlns:bs7="http://www.govtalk.gov.uk/people/bs7666">TEST</bs7:AdministrativeArea></rol:BS7666Address > > > > <http://www.govtalk.gov.uk/people/bs7666%22%3ETEST%3C/bs7:AdministrativeArea%3E%3C/rol:BS7666Address> > > > > > > > However, businessDescription.getContact().xmlText() gives > > > > <xml-fragment/> > > > > I have seen the same behaviour with DateTime. > > > > I was doing: > > > > contact.setDateTime(Calendar.getInstance()) // line 1 > > contact.getDateTime().setTime(someDate); // line 2 > > > > If I call contact.getDateTime() now it will still hold the same date and > > time set in line 1 > > > > > > I had to change the code to do: > > > > Calendar cal = Calendar.getInstance(); > > cal.setTime(someDate); > > contact.setDateTime(someDate); > > > > I assumed this must be due to XMLBeans passing back a copy of the > > Calendar object when calling contact.getDateTime() > > > > > > > > > > > > ------------------------------ > > *From:* Jacob Danner [mailto:[EMAIL PROTECTED] > > *Sent:* 11 January 2008 17:52 > > *To:* [email protected] > > *Subject:* Re: [newbie] difference between addNew and ( > > Factory.newInstance + set) > > > > Hi Paul, > > Can you do a > > System.out.println(contact.xmlText()); > > in each of the scenarios below? > > How is Address defined in the schema? > > Thanks, > > -jacobd > > > > On Jan 11, 2008 9:29 AM, Paul French < [EMAIL PROTECTED]> wrote: > > > > > Hello, > > > > > > I have created a library using scomp from an xml schema. > > > > > > I am building a XML document using this library. I have come across > > > some behaviour I do not understand. For this example a BusinessDescription > > > may have a Contact and a Contact may have an Address. > > > > > > > > > If I do the following: > > > > > > BusinessDescription.Contact contact = > > > businessDescription.addNewContact(); > > > contact.setAddress(address); > > > > > > if (businessDescription.getContact().getAddress() != null) > > > { > > > System.out.println("Address is not null"); > > > } > > > else > > > { > > > System.out.println("Address is null"); > > > } > > > > > > My code prints out "Address is not null" as expected > > > > > > > > > However If I do the following: > > > > > > BusinessDescription.Contact contact = > > > BusinessDescription.Contact.Factory.newInstance(); > > > businessDescription.setContact(contact); > > > contact.setAddress(address); > > > > > > if (businessDescription.getContact().getAddress() != null) > > > { > > > System.out.println("Address is not null"); > > > } > > > else > > > { > > > System.out.println("Address is null"); > > > } > > > > > > My code prints out "Address is null". > > > > > > For some reason setting the address on the contact object after the > > > contact object is set on the businessDescription is ignored. XMLBeans must > > > be cloning objects internally?? This behaviour is unintuitive to me? Can > > > someone explain. > > > > > > Thanks > > > > > > > > > > > -- > > I'm competing in a Half-Ironman distance triathlon to raise money for > > the fight against cancer! > > Please help support my efforts by going to: > > http://www.active.com/donate/tntwaak/jacobd > > > > > > -- > I'm competing in a Half-Ironman distance triathlon to raise money for the > fight against cancer! > Please help support my efforts by going to: > http://www.active.com/donate/tntwaak/jacobd > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > -- I'm competing in a Half-Ironman distance triathlon to raise money for the fight against cancer! Please help support my efforts by going to: http://www.active.com/donate/tntwaak/jacobd

