根据属性类型获取XmlElement或XmlValue

时间:2018-12-13 15:53:53

标签: java xml jaxb

我想使用注释来解析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;

    }

但是它不起作用,因为不能同时存在值和元素。如何使用注释来做到这一点?

1 个答案:

答案 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充满 StringCalendar对象的混合物。

例如:

  • 用于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;
}