我有一个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类?
答案 0 :(得分:2)
你可以使任何类型的NightRates字段。并通过org.w3c.dom.Element:
处理其内容@XmlAnyElement
protected Element NightRates;
答案 1 :(得分: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());
}
}
<强> 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;
}
}
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。
如果您需要支持阅读和写入此格式,您可以使用MOXy的@XmlVariableNode
扩展名。