【问题标题】:JAXB Define XML elements with dotsJAXB 用点定义 XML 元素
【发布时间】:2021-04-23 17:45:15
【问题描述】:

我需要创建一个与此结构匹配的 XML:

<OfferPackage Name="aaa">
    <OfferPackage.Offers>
        <OfferCollection Capacity="1">
            <Offer Price="12.34"/>
            <Offer Price="12.34"/>
        </OfferCollection>
    </OfferPackage.Offers>
</OfferPackage>

我的问题是我不知道如何在这里实现:&lt;OfferPackage.Offers&gt;。我怎样才能只用注释来获得这个“点符号”?我得到的一切看起来像这样:

<OfferPackage Name="aaa">
  <OfferCollection Capacity="1">
    <Offer Price="12.34"/>
    <Offer Price="12.34"/>
  </OfferCollection>
</OfferPackage>

这是我当前的代码:

@XmlRootElement(name = "OfferPackage")
@XmlAccessorType(XmlAccessType.FIELD)
public class OfferPackage {
    
    @XmlAttribute(name = "Name")
    private String name = null;

    @XmlElement( name = "OfferCollection")
    private List<OfferCollection> offers = null;

    @SneakyThrows
    public String toString() {
        var sw = new StringWriter();
        var marshaller = JAXBContext
                .newInstance(OfferPackage.class)
                .createMarshaller();

        marshaller.setProperty(JAXB_FRAGMENT, true);
        marshaller.marshal(this, sw);

        return sw.toString();
    }
}
@XmlRootElement(name = "Offer")
@XmlAccessorType(XmlAccessType.FIELD)
public class OfferCollection {

    @XmlAttribute(name = "Capacity")
    private Integer capacity = null;

    @XmlElement(name = "Offer")
    private List<Offer> offer = null;
}

【问题讨论】:

    标签: java xml annotations jaxb


    【解决方案1】:

    您可以使用@XmlElementWrapper annotation 实现所需的行为:

    围绕 XML 表示生成一个包装器元素。这主要用于生成围绕集合的包装 XML 元素。

    在您的情况下,它看起来类似于:

    @XmlRootElement(name = "OfferPackage")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class OfferPackage {
        
        @XmlAttribute(name = "Name")
        private String name = null;
    
        @XmlElementWrapper(name="OfferPackage.Offers")
        @XmlElement( name = "OfferCollection")
        private List<OfferCollection> offers = null;
    
        @SneakyThrows
        public String toString() {
            var sw = new StringWriter();
            var marshaller = JAXBContext
                    .newInstance(OfferPackage.class)
                    .createMarshaller();
    
            marshaller.setProperty(JAXB_FRAGMENT, true);
            marshaller.marshal(this, sw);
    
            return sw.toString();
        }
    }
    

    其他可能性是定义一个中间类 OfferPackageOffers 来包装 OfferCollection List::

    @XmlRootElement(name = "OfferPackage.Offers")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class OfferPackageOffers {
    
      @XmlElement( name = "OfferCollection")
      private List<OfferCollection> offers = null;
    
      //...
    }
    

    并使用OfferPackage 中的新类而不是提到的OfferCollection List

    @XmlRootElement(name = "OfferPackage")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class OfferPackage {
    
      @XmlAttribute(name = "Name")
      private String name = null;
    
      @XmlElement( name = "OfferPackage.Offers")
      private OfferPackageOffers offers = null;
    
      //...
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多