我正在使用JAXB分解从XML到Java的复杂对象。 XML中有问题的部分看起来像:
<product>
<!-- SNIP -->
<keywords>
<keyword optionalAttribute="attrValue">Value</keyword>
<keyword>Another value</keyword>
</keywords>
</product>
我有一个Java类,用于父对象和带有javax.xml.bind.annotation.*
批注的复杂属性(包括关键字)。
@XmlRootElement(name = "product")
@XmlAccessorType(XmlAccessType.NONE)
public class Product extends Model {
// SNIP
@XmlElementWrapper(name = "keywords")
@XmlElement(name = "keyword")
public List<ProductKeyword> keywords;
}
@XmlRootElement(name = "keyword")
@XmlAccessorType(XmlAccessType.NONE)
public class ProductKeyword extends Model {
@XmlAttribute(name = "optionalAttribute")
public String optionalAttribute;
@XmlMixed
public String keyword;
}
ProductKeyword.keyword
字段需要保留<keyword>
元素的值,该元素是子类的根元素。 @XmlMixed
似乎没有诱使JAXB尝试将任何内容解组到该字段中。
我相信我需要@XmlValue
,但是不能在子类上使用该注释(除非超类用@XmlTransient
注释。)
有人可以提出解决方法吗?
约束:
我无法更改XML的格式。
我无法摆脱Model
超类(需要持久性)
我无法(通过外部库)修改超类
无约束:
如果需要,我可以向父或子Java类添加额外的字段。
如果我可以通过任何形式或任何方式将关键字的值输入到类中,那么我可以进行所需的任何后处理,以正确的位置/格式获取它。
< / li>不一定要漂亮。
答案 0 :(得分:1)
我尝试输入代码,您可以重试! 在您的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>
然后,您无需更改任何pojo!只需更改解组方式即可! 我将xml存储在文件中,您可以使用inputstream或任何方式。
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);
}