Jaxb 注释向元素添加属性
我正在升级一个Java对象,该对象当前具有以下XML表示形式:Jaxb 注释向元素添加属性,jaxb,Jaxb,我正在升级一个Java对象,该对象当前具有以下XML表示形式: <myObjects> <myObject uid="42" type="someEnum"> <name>Waldo</name> <description>yada yada</description> <myElement>some_string</myElement>
<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_字符串”)这项技术是否有遗漏?
- 是否有办法将元素作为字符串(“某个字符串”)获取,我将自己处理它?
- 您推荐其他方法吗?
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的映射的更多信息,请参阅:
- 答案非常简单:我太习惯于用XmlElement和XmlAttribute进行注释,以至于我忘记了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;
}