Java 如何(取消)整理子类中根元素的值
我正在使用JAXB将一个复杂对象从XML解组为Java。XML中有问题的部分如下所示:Java 如何(取消)整理子类中根元素的值,java,xml,jaxb,Java,Xml,Jaxb,我正在使用JAXB将一个复杂对象从XML解组为Java。XML中有问题的部分如下所示: <product> <!-- SNIP --> <keywords> <keyword optionalAttribute="attrValue">Value</keyword> <keyword>Another value</keyword> </keywords
<product>
<!-- SNIP -->
<keywords>
<keyword optionalAttribute="attrValue">Value</keyword>
<keyword>Another value</keyword>
</keywords>
</product>
ProductKeyword.keyword
字段需要保存
元素的值,该元素是子类的根元素@XmlMixed
似乎不会诱使JAXB尝试将任何内容解组到该字段中
我相信我需要@XmlValue
,但该注释不能用于子类(除非可能使用@xmltransive
注释超类)
有人能提出一个解决这个问题的办法吗
限制条件:
- 我无法更改XML的格式
- 我无法摆脱
超类(持久性所需)模型
- 我无法修改超类(从外部库)
- 如果需要,我可以向父类或子类添加额外的字段
- 如果我可以以任何形式或通过任何方式将关键字的值输入到类中,我可以做任何需要的后处理,以使其处于正确的位置/格式
- 它不一定要漂亮
- 我在代码中输入了trid,您可以再试一次!
在Maven或下载jar中添加了此依赖项
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.5.0-RC1</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.persistence</groupId>
<artifactId>commonj.sdo</artifactId>
</exclusion>
</exclusions>
</dependency>
这里需要getter/setter吗?我想是的。我应该解释一下公众的特点/缺少能手和二传手。我们使用游戏!在后台进行封装和显式getter/setter的框架只用于需要实现自定义行为的地方。不确定您的意思是一般需要还是JAXB注释需要,但是所有其他JABX注释放在字段中都可以正常工作。请检查。似乎您需要
@xmlacessortype(xmlacesstype.PROPERTY)
谢谢您的建议。尝试过之后,当我尝试处理文件时,它会导致许多IllegalAnnotationException
s。我也非常怀疑如果我能让它工作起来会有什么不同:如前所述,其他所有@Xml*
注释在放置到字段时都能按预期工作,如果没有这一点,那么如果@XmlMixed
是唯一对它敏感的注释,那就很奇怪了。我相信这会解决我的问题,但在我有机会尝试之前,我被告知此时不要担心解决这个特定问题。不过,谢谢你。
@XmlRootElement(name = "keyword")
@XmlAccessorType(XmlAccessType.NONE)
public class ProductKeyword extends Model {
@XmlAttribute(name = "optionalAttribute")
public String optionalAttribute;
@XmlMixed
public String keyword;
}
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.5.0-RC1</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.persistence</groupId>
<artifactId>commonj.sdo</artifactId>
</exclusion>
</exclusions>
</dependency>
public static void main(String[] args) throws JAXBException, IOException {
JAXBContext context = JAXBContextFactory.createContext(new Class[]{Product.class}, new HashMap());
Unmarshaller unmarshaller = context.createUnmarshaller();
InputStream is = new ClassPathResource("stand.xml").getInputStream();
Product product= (Product) unmarshaller.unmarshal(is);
System.out.println(product);
}