I am using Jaxb to build Java classes for marshalling xml data from the upnp didlite specification, the required xsd files can be found at https://gitlab.gnome.org/GNOME/gupnp-av/-/tree/master/data
It works but not as well as I would like some elements dont return getters and setters for most attributes or even a name/value map. Instead they just provide a list of all JAXBElements that I have to iterate through to find the attribute I want, why is that ?
/**
* Gets the value of the allowedUnderItem property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the allowedUnderItem property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getAllowedUnderItem().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link JAXBElement }{@code <}{@link ChannelGroupNameType }{@code >}
* {@link JAXBElement }{@code <}{@link ChannelIDType }{@code >}
* {@link JAXBElement }{@code <}{@link DayOfWeekEnLen3 }{@code >}
* {@link JAXBElement }{@code <}{@link DescType }{@code >}
* {@link JAXBElement }{@code <}{@link DeviceUDNType }{@code >}
* {@link JAXBElement }{@code <}{@link ElementType }{@code >}
* {@link JAXBElement }{@code <}{@link ElementType }{@code >}
* {@link JAXBElement }{@code <}{@link ElementType }{@code >}
* {@link JAXBElement }{@code <}{@link ElementType }{@code >}
* {@link JAXBElement }{@code <}{@link ElementType }{@code >}
* {@link JAXBElement }{@code <}{@link ElementType }{@code >}
* {@link JAXBElement }{@code <}{@link ElementType }{@code >}
* {@link JAXBElement }{@code <}{@link ElementType }{@code >}
* {@link JAXBElement }{@code <}{@link ForeignMetadataType }{@code >}
* {@link JAXBElement }{@code <}{@link GenreType }{@code >}
* {@link JAXBElement }{@code <}{@link InclusionType }{@code >}
* {@link JAXBElement }{@code <}{@link ObjectLinkRefType }{@code >}
* {@link JAXBElement }{@code <}{@link ObjectLinkType }{@code >}
* {@link JAXBElement }{@code <}{@link OwnerType }{@code >}
* {@link JAXBElement }{@code <}{@link PersonWithRoleType }{@code >}
* {@link JAXBElement }{@code <}{@link PersonWithRoleType }{@code >}
* {@link JAXBElement }{@code <}{@link PersonWithRoleType }{@code >}
* {@link JAXBElement }{@code <}{@link PreservedTimeRangeType }{@code >}
* {@link JAXBElement }{@code <}{@link PriceType }{@code >}
* {@link JAXBElement }{@code <}{@link ProgramCodeType }{@code >}
* {@link JAXBElement }{@code <}{@link ProgramIDType }{@code >}
* {@link JAXBElement }{@code <}{@link ProgramIDType }{@code >}
* {@link JAXBElement }{@code <}{@link ProgramListType }{@code >}
* {@link JAXBElement }{@code <}{@link ProgramPreservedType }{@code >}
* {@link JAXBElement }{@code <}{@link QualifiedDateTime }{@code >}
* {@link JAXBElement }{@code <}{@link QualifiedDateTime }{@code >}
* {@link JAXBElement }{@code <}{@link QualifiedDateTimeISO8601 }{@code >}
* {@link JAXBElement }{@code <}{@link QualifiedDateTimeISO8601 }{@code >}
* {@link JAXBElement }{@code <}{@link QualifiedDateTimeRange }{@code >}
* {@link JAXBElement }{@code <}{@link RatingType }{@code >}
* {@link JAXBElement }{@code <}{@link ResExtType }{@code >}
* {@link JAXBElement }{@code <}{@link ResType }{@code >}
* {@link JAXBElement }{@code <}{@link SearchClassType }{@code >}
* {@link JAXBElement }{@code <}{@link SearchClassType }{@code >}
* {@link JAXBElement }{@code <}{@link StateVariableCollectionType }{@code >}
* {@link JAXBElement }{@code <}{@link StatusType }{@code >}
* {@link JAXBElement }{@code <}{@link Boolean }{@code >}
* {@link JAXBElement }{@code <}{@link Boolean }{@code >}
* {@link JAXBElement }{@code <}{@link Boolean }{@code >}
* {@link JAXBElement }{@code <}{@link Boolean }{@code >}
* {@link JAXBElement }{@code <}{@link Integer }{@code >}
* {@link JAXBElement }{@code <}{@link Integer }{@code >}
* {@link JAXBElement }{@code <}{@link Integer }{@code >}
* {@link JAXBElement }{@code <}{@link Integer }{@code >}
* {@link JAXBElement }{@code <}{@link Long }{@code >}
* {@link JAXBElement }{@code <}{@link Long }{@code >}
* {@link JAXBElement }{@code <}{@link Long }{@code >}
* {@link JAXBElement }{@code <}{@link Long }{@code >}
* {@link JAXBElement }{@code <}{@link Long }{@code >}
* {@link JAXBElement }{@code <}{@link Long }{@code >}
* {@link JAXBElement }{@code <}{@link Long }{@code >}
* {@link JAXBElement }{@code <}{@link Long }{@code >}
* {@link JAXBElement }{@code <}{@link Long }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link String }{@code >}
* {@link JAXBElement }{@code <}{@link List }{@code <}{@link String }{@code >}{@code >}
*
*
*/
public List<JAXBElement<?>> getAllowedUnderItem() {
if (allowedUnderItem == null) {
allowedUnderItem = new ArrayList<JAXBElement<?>>();
}
return this.allowedUnderItem;
}
meaning I have to write code like
if(object instanceof ContainerType)
{
id = ((ContainerType)object).getId();
title = ((ContainerType)object).getTitle().getValue();
Iterator<JAXBElement<?>> i = ((ContainerType)object).getAllowedUnderContainer().iterator();
while(i.hasNext())
{
JAXBElement next = i.next();
if(next.getName().getLocalPart().equals("albumArtURI"))
{
albumArtistUri = (String)next.getValue();
}
}
}
How can I improve this ?
Please try using the following in a terminal. You should have all the required Java Beans created.
What this does is uses the xjc command line tool to generate the artifacts from the supplied xsd. You can read more about it here: Using JAXB xjc tooling to generate JAXB classes from an XML schema file