JAXB使用动态元素进行解组

时间:2013-11-07 11:28:38

标签: java xml jaxb unmarshalling

我有一个XML如下。

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

元素Night1,Night2,Night3始终是动态的,此计数可能在1到35倍之间变化。父标记<NightRates>始终保持一致。

元素<Night1><Night2> ..没有任何其他属性。它提供了有关每晚酒店房价的信息。

我想创建一个'LinkedList'(保存顺序),其中包含单个夜晚的费率信息。如何在不知道元素出现次数的情况下处理这种情况?如何为这个xml创建java类?

2 个答案:

答案 0 :(得分:2)

你可以使任何类型的NightRates字段。并通过org.w3c.dom.Element:

处理其内容
@XmlAnyElement
protected Element NightRates;

答案 1 :(得分:1)

仅限Unmarshal

如果您只是在进行解组,那么您可以使用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());
    }

}

<强> HotelRoomDetails

然后你有一个集合属性,它映射到名为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;
    }

}

Unmarshal&amp;元帅

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

如果您需要支持阅读和写入此格式,您可以使用MOXy的@XmlVariableNode扩展名。