0

我想使用注释解析 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,它应该返回元素 (when type="calendar") 或 value when type="String"

使用 Lombok 它应该是这样的:

    @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;

    }

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

4

1 回答 1

0

没有简单的方法可以根据 XML 属性返回一个或另一个属性。

但作为问题的部分解决方案,您可以在类中使用<entry ...>和 的</entry> 组合对@XmlMixed混合内容进行建模。@XmlElementRefList<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;
}
于 2018-12-13T22:21:32.250 回答