Java 使用动态元素进行JAXB解组

Java 使用动态元素进行JAXB解组,java,xml,jaxb,unmarshalling,Java,Xml,Jaxb,Unmarshalling,我有一个XML,如下所示 <hotelRoomDetails> <NightRates> <Night1>67</Night1> <Night2>67.5</Night2> ........ ........ <Night25>65</Night25> </NightRates> ....... </hotelRoomDetails

我有一个XML,如下所示

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

67
67.5
........
........
65
.......
元素Night1、Night2、Night3始终是动态的,并且此计数可能在1到35次之间变化。父标记
总是一致的

元素
。。没有任何其他属性。它提供了关于每晚酒店价格的信息


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

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

@XmlAnyElement
protected Element NightRates;
仅解编 如果只是进行解组,则可以使用
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;
    }

}
import java.util.*;
导入javax.xml.bind.annotation.*;
@XmlRootElement
公共类酒店客房详细信息{
private List nightRates=new ArrayList();
@XmlElementWrapper(name=“NightRates”)
@xmlement(name=“Night”)
公共列表getNightRates(){
返回夜利率;
}
}

解封与封送 注意:我是专家组的负责人和成员

如果您需要支持对此格式的读写,可以使用MOXy的
@XmlVariableNode
扩展


您为什么需要。。。。而不仅仅是重复使用一个标签?@PaulLo我得到了如上所述的回应。我只是在利用这项服务。也许是时候在四点之前用一个线索来打击那个服务提供商了。这是一种非常糟糕的XML格式。