Java将XML转换为动态的XML

我正在寻找从XML定义创建和加载JAVA对象的最佳工具/方法。 我已经检查了JAXB ,看起来相当不错,但是没有发现是否有办法使用实体哪些属性是动态的,或者不时更改,所以想要有类似自动处理实体的方式,而不需要转换将对象转换为预定义的Entity对象。 这样的事情存在吗?

工作流将类似于从具有动态属性集的每个实体的XML创建类读取和/或为这些实体创建ORM映射部分,然后所有操作检索/存储到db或可能将使用某些NoSQL解决方案,如MongoDB。

注意:我是EclipseLink JAXB(MOXy)的负责人,也是JAXB 2( JSR-222 )专家组的成员。


查看以下EclipseLink示例。 它演示了如何在JPA和JAXB实现中使用动态属性:


选项#1 – 具有动态属性的静态对象

MOXy有一个@XmlVirtualAccessMethods扩展,它允许您将映射中的条目映射到XML。 这允许您向静态类添加属性。 在下面的示例中,Customer类具有“真实”名称属性,并且可能具有许多“虚拟”属性。

 package blog.metadatasource.refresh; import java.util.*; import javax.xml.bind.annotation.*; import org.eclipse.persistence.oxm.annotations.XmlVirtualAccessMethods; @XmlRootElement @XmlType(propOrder={"firstName", "lastName", "address"}) @XmlVirtualAccessMethods public class Customer { private String name; private Map extensions = new HashMap(); public String getName() { return name; } public void setName(String name) { this.name = name; } public Object get(String key) { return extensions.get(key); } public void set(String key, Object value) { extensions.put(key, value); } } 

虚拟属性是通过MOXy的XML元数据定义的。 在下面的示例中,我们将添加两个属性:middleName和shippingAddress。

            

欲获得更多信息


选项#2 – 动态对象

MOXy还提供完整的动态对象模型:

 DynamicJAXBContext jaxbContext = DynamicJAXBContextFactory.createContextFromXSD(xsdInputStream, null, null, null); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); DynamicEntity customer = (DynamicEntity) unmarshaller.unmarshal(inputStream); DynamicEntity address = jaxbContext.newDynamicEntity("org.example.Address"); address.set(street, "123 A Street"); address.set(city, "Any Town"); customer.set("address", address); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.marshal(customer, System.out); 

欲获得更多信息

那么,您基本上是在尝试使用XML文件制作POJO(普通的旧Java对象)? 它们就像数据类一样,对吧?

我是XStream的忠实粉丝,它非常易于使用,如果你不需要validation,效果很好。 我需要使用Castor来validation模式。 我只是使用XStream将对象保存到xml文件然后我可以从任何地方读回来,即使我更改了与对象关联的数据值(我认为这是“动态属性集”的意思,对?)。