JAXB从XML架构生成类并未返回所有属性的Getter Setter

发布于 2025-02-03 04:33:38 字数 8234 浏览 3 评论 0 原文

我正在使用jaxb来构建Java类,以从 https:/> 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地图。取而代之的是,他们只提供了我必须迭代以找到我想要的属性的所有jaxbelements的列表,为什么?

/**
 * 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 ?

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 ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

凉月流沐 2025-02-10 04:33:38

尽管在这种情况下可能很困难,但由于您正在使用的模式的复杂性,但是您可以尝试使用 jaxb xml绑定为此。

JAXB XML绑定使您可以以不同的方式自定义JAXB Java类生成过程。

在这些自定义中,它使您可以指示生成器使用自己的类模型。

该信息应在绑定XML文件中提供; in your use case, it could be similar to this:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jaxb:bindings schemaLocation="didl-lite-v2.xsd">
        <jaxb:bindings node="//xsd:complexType[@name='container.type']">
            <jaxb:class ref="didl.ContainerType"/>
        </jaxb:bindings>
        <jaxb:bindings node="//xsd:complexType[@name='item.type']">
            <jaxb:class ref="didl.ItemType"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

Note the definition of the custom classes didl.ContainerType and didl.ItemTypein order to represent the complex types Container.Type item.Type

ContainerType could look like this:

package didl;

import javax.xml.bind.annotation.XmlElement;

public class ContainerType {

  @XmlElement(
      name = "title", namespace = "http://purl.org/dc/elements/1.1/"
  )
  private String title;

  @XmlElement(
      name = "albumArtURI", namespace = "urn:schemas-upnp-org:metadata-1-0/upnp/"
  )
  private String albumArtURI;

  // Other fields

  public String getTitle() {
    return title;
  }

  public String getAlbumArtURI() {
    return albumArtURI;
  }
  
  // Other getters
}

I will use the xjc tool in the answer but the solution should be easily portable to Maven, for example.

Using xjc, you need to generate your code like this to tale into account the bindings file and classes requested:

xjc -d output -b binding.xml didl-lite-v2.xsd -classpath /path/to/custom/classes

As you can see, we provided both the bindings file, binding.xml,以及 classPath 生成器应在其中搜索您的自定义类。

The same approach, although for simpler use cases, has been exemplified here in different questions in Stackoverflow, for example in these ones:

This Oracle article已经过时了,但是它提供了一个很好的解释,即有关字段之间的实际对应关系。

Although probably difficult in this case, due to the complexity of the schema you are working with, but you could try using JAXB XML bindings for this purpose.

JAXB XML bindings allows you to customize the JAXB Java classes generation process in different ways.

Among these customizations, it allows you to instruct the generator to use your own model of classes.

This information should be provided in a bindings XML file; in your use case, it could be similar to this:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jaxb:bindings schemaLocation="didl-lite-v2.xsd">
        <jaxb:bindings node="//xsd:complexType[@name='container.type']">
            <jaxb:class ref="didl.ContainerType"/>
        </jaxb:bindings>
        <jaxb:bindings node="//xsd:complexType[@name='item.type']">
            <jaxb:class ref="didl.ItemType"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

Note the definition of the custom classes didl.ContainerType and didl.ItemTypein order to represent the complex types container.type and item.type, respectively.

ContainerType could look like this:

package didl;

import javax.xml.bind.annotation.XmlElement;

public class ContainerType {

  @XmlElement(
      name = "title", namespace = "http://purl.org/dc/elements/1.1/"
  )
  private String title;

  @XmlElement(
      name = "albumArtURI", namespace = "urn:schemas-upnp-org:metadata-1-0/upnp/"
  )
  private String albumArtURI;

  // Other fields

  public String getTitle() {
    return title;
  }

  public String getAlbumArtURI() {
    return albumArtURI;
  }
  
  // Other getters
}

I will use the xjc tool in the answer but the solution should be easily portable to Maven, for example.

Using xjc, you need to generate your code like this to tale into account the bindings file and classes requested:

xjc -d output -b binding.xml didl-lite-v2.xsd -classpath /path/to/custom/classes

As you can see, we provided both the bindings file, binding.xml, and the classpath where the generator should search for your custom classes.

The same approach, although for simpler use cases, has been exemplified here in different questions in Stackoverflow, for example in these ones:

This Oracle article is quite dated, but it provides a good explanation about how the actual correspondence between fields happens.

盗心人 2025-02-10 04:33:38

请尝试在终端中使用以下内容。您应该创建所有所需的Java bean。

& "C:\Program Files\Java\jdk1.8.0_333\bin\xjc" -d src -p com.example https://gitlab.gnome.org/GNOME/gupnp-av/-/raw/master/data/av.xsd

这样做的是使用XJC命令行工具从提供的XSD生成工件。您可以在此处阅读更多有关它的信息:使用JAXB XJC工具从XML架构文件生成JAXB类

Please try using the following in a terminal. You should have all the required Java Beans created.

& "C:\Program Files\Java\jdk1.8.0_333\bin\xjc" -d src -p com.example https://gitlab.gnome.org/GNOME/gupnp-av/-/raw/master/data/av.xsd

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文