java - @XmlEnum 属性与 JAXB

标签 java xml enums jaxb

我在使用 jaxb 创建枚举以生成我想要的 xml 时遇到问题,我尝试使用 @xmlEnum 注释但没有使用属性!

我会给你举个例子来阐明这一点:

XML

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<FilePollerConfiguration configFilePath="">
    <Directory path="C://Users//jmoreau040612//Desktop//Old">
        <Match pattern="*.xml">
            <Event name="create | modify | delete"> //here i want the enum in attribute
           <FTPSend>
          <FTPServer>toto.sgcib.com</FTPServer>
          <FTPPort>21</FTPPort>
          <FTPLogin>toto</FTPLogin>
          <FTPPassword>titi</FTPPassword>
                  <FTPDestinationPath>/root/src</FTPDestinationPath>
      </FTPSend>
       </Event>
   </Match>
   <Match pattern="*.csv">
       <Event name="create | modify | delete"> //here i want the enum in attribute
           <MailSend>
           <SMTPServer>smtp.fr.socgen</SMTPServer>
           <SMTPPort>25</SMTPPort>
           <MailTo>toto@sgcib.com</MailTo>
           <MailFrom>titi@sgcib.com</MailFrom>
           <Subject>tata</Subject>
           <Body>blabla</Body>
       </MailSend>
        </Event>
    </Match>
</Directory>
</FilePollerConfiguration>

java 部分我有以下代码:

@XmlAccessorType(XmlAccessType.FIELD)
public class Event {

     //I would like this enum in attribute of "Event"
@XmlType
@XmlEnum(String.class)
public enum name{
    @XmlEnumValue("create") CREATE,
    @XmlEnumValue("modify") MODIFY,
    @XmlEnumValue("delete") DELETE
}

@XmlElements(value = {
         @XmlElement(type=FTPSendConfiguration.class, name="FTPSend"),
         @XmlElement(type=SFTPSendConfiguration.class, name="SFTPSend"),
         @XmlElement(type=MailSendConfiguration.class, name="MailSend"),
         @XmlElement(type=
                 ServerToServerSendConfiguration.class,    name="ServerToServer")
})
ArrayList<IAction> actionsList = new ArrayList<IAction>();

public Event(){

}

public ArrayList<IAction> getActionsList() {
    return actionsList;
}

public void setActionsList(ArrayList<IAction> actionsList) {
    this.actionsList = actionsList;
}

}

因此,如果您有任何想法,不客气 =)

谢谢。

最佳答案

尝试向您的类添加另一个字段并将其标记为@XmlAttribute:

@XmlAttribute(name="name")  // "name" will be the name of your attribute in the xml file
name eventAttribute;        // this field has type name (your enum that probably should be better to call in a different way ...)

如果我正确理解了您的需求,这应该可以解决您的问题。

再见!

更新(使用 schemagen 生成的 .xsd 文件):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="event">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="FTPSend" type="xs:string"/>
        <xs:element name="SFTPSend" type="xs:string"/>
        <xs:element name="MailSend" type="xs:string"/>
        <xs:element name="ServerToServer" type="xs:string"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="name" type="name"/>
  </xs:complexType>

  <xs:simpleType name="name">
    <xs:restriction base="xs:string">
      <xs:enumeration value="create"/>
      <xs:enumeration value="modify"/>
      <xs:enumeration value="delete"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

您可以看到 complexType event 有一个名为“name”的属性,类型为“name”,类型名称定义为 simpleType 使用枚举

最终更新:

这是我写的:

package jaxb;

import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Event {

    // I would like this enum in attribute of "Event"
    @XmlType
    @XmlEnum(String.class)
    public enum name {
        @XmlEnumValue("create")
        CREATE, @XmlEnumValue("modify")
        MODIFY, @XmlEnumValue("delete")
        DELETE
    }

    @XmlAttribute(name = "name")
    name eventAttribute;

    public name getEventAttribute() {
        return eventAttribute;
    }

    public void setEventAttribute(name eventAttribute) {
        this.eventAttribute = eventAttribute;
    }

    @XmlElements(value = {
            @XmlElement(type = FTPSendConfiguration.class, name = "FTPSend"),
            @XmlElement(type = SFTPSendConfiguration.class, name = "SFTPSend"),
            @XmlElement(type = MailSendConfiguration.class, name = "MailSend"),
            @XmlElement(type = ServerToServerSendConfiguration.class, name = "ServerToServer") })
    ArrayList<IAction> actionsList = new ArrayList<IAction>();

    public Event() {

    }

    public ArrayList<IAction> getActionsList() {
        return actionsList;
    }

    public void setActionsList(ArrayList<IAction> actionsList) {
        this.actionsList = actionsList;
    }

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Event.class);
        Event e = new Event();
        e.eventAttribute = name.CREATE;  // I set this field using the enum (it could be set to name.DELETE or name.MODIFY as well)
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(e, System.out);
    }
}

如果执行main方法,结果如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<event name="create"/>

这是一个带有来自枚举的属性的事件标签......

我希望这最后的尝试能帮到你......

关于java - @XmlEnum 属性与 JAXB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19537320/

相关文章:

java - 跨多个线程的 Spring 方面

c# - 使用 C# 在生成器设计模式中集成序列化和反序列化

C++ 函数接收枚举作为其参数之一

c# - Linq 包含枚举数组

objective-c - Typedef 枚举 Objective-C

java - 从 JavaMail 消息中预取预览文本

java - 如何将两个改造请求中的数据传递到单个 recyclerview 适配器

c# - 从 XmlSerializer 生成 Xml 时如何控制 Xml 文档中字符串项数组的 XmlElement 名称

xml - 我应该在 Android 应用程序中使用 XML 还是 JSON 作为数据格式?

java - 更改文本框颜色 - 应用程序。很冷