我想使用注释来解析XML。
第一个XML:
<?xml version="1.0" encoding="utf-8"?>
<something version="1.1" type="Config">
<section name="General">
<entry name="calendar" type="calendar">
<calendar timezone="" datetimepattern="dd-MM-yyyy H:mm:ss">
<weekly_rule name="24h">
<start_time>00:00</start_time>
<end_time>23:59</end_time>
<days>SU,MO,TU,WE,TH,FR,SA</days>
</weekly_rule>
</calendar>
</entry>
</section>
</something>
第二个XML:
<?xml version="1.0" encoding="utf-8"?>
<something version="2.5.3.2" type="Config">
<section name="General">
<entry name="BO_1" type="String">Dummy1</entry>
<entry name="BO_2" type="String">Dummy2</entry>
<entry name="BO_0" type="String">Dummy3</entry>
</section>
</something>
我的问题是与entry
元素有关。根据属性type
,它应该返回元素(当type="calendar"
时)或返回值,当type="String"
时。
使用龙目岛应该是这样的:
@ToString
@Getter
@Setter
@XmlAccessorType(XmlAccessType.FIELD)
public static class Entry {
@XmlAttribute(name = "name")
private String name;
@XmlAttribute(name = "type")
private String type;
@XmlValue
private String text;
private Object calendar;
}
但是它不起作用,因为不能同时存在值和元素。如何使用注释来做到这一点?
答案 0 :(得分:0)
没有简单的方法可以返回一个或另一个属性 取决于XML属性。
但是作为部分解决方案,
您可以对<entry ...>
和</entry>
之间的混合内容进行建模
通过结合使用@XmlMixed
和@XmlElementRef
在您的List<Object>
类中的Entry
属性上。
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
public class Entry {
@XmlAttribute
private String name;
@XmlAttribute
private String type;
@XmlMixed
@XmlElementRef(name = "calendar", type = Calendar.class)
private List<Object> mixedContent;
}
您还需要注释您的Calendar
类
@XmlRootElement(name="calendar"
)。
在解组XML元素<entry ...>...</entry>
期间
List<Object> mixedContent
充满
String
和Calendar
对象的混合物。
例如:
用于XML输入
<entry name="BO_1" type="String">Dummy1</entry>
List<Object> mixedContent
仅包含一个对象:
字符串"Dummy1"
。
用于XML输入
<entry name="calendar" type="calendar">
<calendar ...>
...
</calendar>
</entry>
List<Object> mixedContent
将包含3个对象:
字符串"\n "
,一个Calendar
对象,字符串"\n "
。
为了更容易获得mixedContent
中有趣的元素,
取决于type
属性,
您可以在Entry
类中添加以下方法。
public Object getContent() {
if (type.equals("String")) {
for (Object obj : mixedContent) {
if (obj instanceof String)
return obj;
}
}
if (type.equals("calendar")) {
for (Object obj : mixedContent) {
if (obj instanceof Calendar)
return obj;
}
}
return null;
}