【问题标题】:How can I encourage JAXB to read XmlElement content string?如何鼓励 JAXB 读取 XmlElement 内容字符串?
【发布时间】:2014-07-29 00:32:15
【问题描述】:

当我尝试解析这样的消息时,我没有收到“通知”:

 <?xml version="1.0" encoding="UTF-8"?>
 <message messageType="SUBSCRIBER" messageName="ANNOUNCEMENT">
     <announcement time="12:30">
         Lunchtime!
     </announcement>
     <announcement time="32:00">
         Good night ...
     </announcement>
     <errorText>Phone number missing, subscriber: Dick</errorText>
 </message>

JAXB Java 类看起来很简单。并且基于有效的类似消息。在这种情况下,区别似乎是我可以在主块中有两种不同类型的嵌套元素(XmlElement)。

下面的代码实际上解析了 XML,但它没有调用 Announcement.setMessageText() 方法。虽然我可以看到 time 属性是从 XML 设置的,并且我有一个数组 size=2 用于公告,但它读取并设置了单个 errorText XmlElement。 顺便说一句,我还从代码和 XML 中删除了标签——我的 messageText 处理没有改变。欢迎提出想法!

 @XmlRootElement(name = "message")
 public class AnnouncementMessage 
 { 
      @XmlAttribute
      public String getMessageName(){
        return this.messageName;
      }
      public void   setMessageName( String name ){
        this.messageName = name;
      }

      @XmlAttribute
      public String getMessageType(){
          return messageType;
      }
      public void  setMessageType( String newMessageType ){
          this.messageType = newMessageType;
     }

      @XmlElement(name = "errorText")
      public String getErrorText(){
          return errorText;
      }
      public void setErrorText( String newMsg ){
          this.errorText = newMsg;
      }

     private     List<Announcement>  announcements   = new ArrayList<>();

  @XmlElement(name = "announcement")
  public List<Announcement> getAnnouncements(){
        return this.announcements;
  }
  public void setAnnouncements( List<Announcement> newAnnouncements ){
        this.announcements = newAnnouncements;
     }
 }

还有 Announcement 类:

 @XmlRootElement(name = "announcement")
 public class Announcement 
 {

     private     String  messageText = "";
     private     String  time        = "12:00";

     XmlAttribute(name ="time")
     public  String  getTime(){
         return this.time;
     }
     public  void    setTime( String newMsg ){
         this.messageText = time;
     }

     @XmlElement(name="announcement")
     public  String  getMessageText(){
         return this.messageText;
     }
     public  void    setMessageText( String newMsg ){
         this.messageText = newMsg;
     }

     Announcement(){
     }
 }

在 XmlElement 中使用 name 参数似乎没有什么区别。我的提前感谢

【问题讨论】:

  • @Blaise Dougan .. 我不认为这是重复的。有一个不同的 XML 数据包适用于:How to bind a xml-element-into an object member variable 问题。那是一种有效的方法。这个类应该是相同的,但事实并非如此。我解析属性,而不是 XmlValue。
  • @BlaiseDougan 同意 OP 这不是重复的。投票重新开放。

标签: java xml jaxb


【解决方案1】:

对消息文本使用@XmlValue注解:

@XmlValue
public  String getMessageText(){
    return this.messageText;
}

此外,如 OP 在 this related answer 中所述,如果 Announcement 类包含未映射到 XML 或从 XML 映射且没有 @XmlTransient 的 getter/setter 对,则需要 @XmlAccessorType(XmlAccessType.NONE)注释。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
相关资源
最近更新 更多