【问题标题】:JAXB Unmarshalling with dynamic elements [duplicate]使用动态元素进行 JAXB 解组 [重复]
【发布时间】:2013-11-19 00:41:03
【问题描述】:

我有一个如下的 XML。

 <hotelRoomDetails>
  <NightRates>
   <Night1>67</Night1>
   <Night2>67.5</Night2> 
   ........
   ........
   <Night25>65</Night25> 
  </NightRates>
  .......
  </hotelRoomDetails>

元素 Night1,Night2,Night3 总是动态的,这个计数可能在 1 到 35 次之间变化。父标签&lt;NightRates&gt; 始终保持一致。

元素&lt;Night1&gt;&lt;Night2&gt; .. 没有任何其他属性。它提供有关酒店每晚价格的信息。

我想创建一个“LinkedList”(以保留订单),其中包含个别夜晚的房价信息。在不知道元素出现次数的情况下如何处理这种情况?如何为这个xml创建java类?

【问题讨论】:

  • 为什么你需要 .... 而不是重复使用一个 标签?
  • @PaulLo 我收到了上述回复。我只是在使用这项服务。
  • 也许是时候用四分之三的线索来打击那个服务提供商了。这是一种非常糟糕的 XML 格式。

标签: java xml jaxb unmarshalling


【解决方案1】:

仅解组

如果您只是在进行解组,则可以使用 StreamReaderDelegate 去除数字后缀。

演示

import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.stream.util.StreamReaderDelegate;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(HotelRoomDetails.class);

        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource("src/forum19834756/input.xml"));
        xsr = new StreamReaderDelegate(xsr) {
            @Override
            public String getLocalName() {
                String localName = super.getLocalName();
                if(localName.startsWith("Night") && !localName.equals("NightRates")) {
                    return "Night";
                }
                return localName;
            }

        };

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        HotelRoomDetails details = (HotelRoomDetails) unmarshaller.unmarshal(xsr);
        System.out.println(details.getNightRates().size());
    }

}

酒店客房详情

然后你有一个集合属性映射到名为Night的元素。

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class HotelRoomDetails {

    private List<String> nightRates = new ArrayList<String>();

    @XmlElementWrapper(name = "NightRates")
    @XmlElement(name = "Night")
    public List<String> getNightRates() {
        return nightRates;
    }

}

元帅和元帅

注意:我是EclipseLink JAXB (MOXy) 领导,也是JAXB (JSR-222) 专家组的成员。

如果你需要支持读写这种格式,你可以使用 MOXy 的@XmlVariableNode 扩展。

【讨论】:

    【解决方案2】:

    您可以将 NightRates 字段设为任何类型。并通过 org.w3c.dom.Element 处理其内容:

    @XmlAnyElement
    protected Element NightRates;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多