Jaxb 注释向元素添加属性

Jaxb 注释向元素添加属性,jaxb,Jaxb,我正在升级一个Java对象,该对象当前具有以下XML表示形式: <myObjects> <myObject uid="42" type="someEnum"> <name>Waldo</name> <description>yada yada</description> <myElement>some_string</myElement>

我正在升级一个Java对象,该对象当前具有以下XML表示形式:

<myObjects>
    <myObject uid="42" type="someEnum">
        <name>Waldo</name>
        <description>yada yada</description>
        <myElement>some_string</myElement>
        ...
    </myObject>
    ...
</myObjects>

瓦尔多
雅达雅达
几根绳子
...
...
myElement是可选的-在Java中可以为空/在XML中可以省略。
我正在添加一个字段,如果myElement具有实际值,则该字段仅与相关 (为了与以前的XML保持兼容性,它本身是可选的)

我试图避免这种情况:

    <myElement>some_string</myElement>
    <myAttr>foo</myAttr>
一些字符串
福
喜欢这样的东西:

    <myElement myAttr="foo">some_string</myElement>
一些字符串
但是现在我已经绞尽脑汁想了两天怎么注释它了

  • 我曾想过用XmlTransient标记它,并让XmlAnyElement在解组时捕获它——但这似乎会在将对象从Java编组回XML时引起问题
  • 我尝试为元素创建一个XmlAdapter,但是unmarshal方法只获取内部内容(“some_字符串”)这项技术是否有遗漏?
  • 是否有办法将元素作为字符串(“某个字符串”)获取,我将自己处理它?
  • 您推荐其他方法吗?
您可以使用@XmlPath扩展轻松完成以下任务:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlPath;

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

    @XmlAttribute
    private int uid;

    @XmlAttribute
    private String type;

    private String name;

    private String description;

    private String myElement;

    @XmlPath("myElement/@myAttr")
    private String myAttr;

}
此类将与以下XML交互:

<myObject uid="42" type="someEnum">
    <name>Waldo</name>
    <description>yada yada</description>
    <myElement myAttr="foo">some_string</myElement>
</myObject>
要将MOXy指定为JAXB实现,您需要在与模型类相同的包中包含一个名为JAXB.properties的文件,其中包含以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
有关MOXy基于XPath的映射的更多信息,请参阅:


    • 答案非常简单:我太习惯于用XmlElementXmlAttribute进行注释,以至于我忘记了XmlValue

      MyObject的代码与Blaise Doughan answer中的代码相同,但有一个变化: myElement现在是一个类(ElemWithAttr),而不是字符串:

      public class ElemWithAttr {
          @XmlValue
          public String content;
      
          @XmlAttribute
          public String myAttr;
      }
      

      如果不清楚的话,我们需要查看您的Java,我只需要保持与以前的XML文件的兼容性。我可以用Java代码做任何我想做的事情。所以我故意不提供它,为了不使你产生偏见(布莱斯·道格汉在下面很好地解释了它)。最终我没有使用你的解决方案(见下面我自己的答案)。但我确实从你的解释和你的博客中学到了很多,所以我把它标记为“已接受”:-)
      public class ElemWithAttr {
          @XmlValue
          public String content;
      
          @XmlAttribute
          public String myAttr;
      }