Java将XML解组到动态对象
我正在寻找从XML定义创建和加载JAVA对象的最佳工具/方法。 我已经签出了,看起来很不错,但没有找到一种方法来处理属性是动态的或不时更改的实体,所以希望有一种类似于自动处理实体的方法,而无需将对象转换为预定义的实体对象。这样的事情存在吗Java将XML解组到动态对象,java,architecture,orm,mapping,jaxb,Java,Architecture,Orm,Mapping,Jaxb,我正在寻找从XML定义创建和加载JAVA对象的最佳工具/方法。 我已经签出了,看起来很不错,但没有找到一种方法来处理属性是动态的或不时更改的实体,所以希望有一种类似于自动处理实体的方法,而无需将对象转换为预定义的实体对象。这样的事情存在吗 工作流是这样的:从XML中读取每个实体的创建类,为这些实体创建一组动态属性和/或ORM映射部分,然后将所有操作检索/存储到db中,或者可能会使用一些NoSQL解决方案,如MongoDB。所以,您基本上是在尝试制作POJO(普通的旧Java对象)使用XML文件?
工作流是这样的:从XML中读取每个实体的创建类,为这些实体创建一组动态属性和/或ORM映射部分,然后将所有操作检索/存储到db中,或者可能会使用一些NoSQL解决方案,如MongoDB。所以,您基本上是在尝试制作POJO(普通的旧Java对象)使用XML文件?它们就像数据类,对吗
我是一个超级粉丝,它非常容易使用,如果你不需要验证的话,效果也非常好。我在需要对模式进行验证时使用过。我只是使用XStream将一个对象保存到一个xml文件中,然后我就可以从任何地方读回它,即使我更改了与该对象相关联的数据值(我想这就是您所说的“动态属性集”,对吧?)。注意:我是负责人,也是JAXB 2()专家组的成员
查看下面的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<String, Object> extensions = new HashMap<String, Object>();
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);
}
}
了解更多信息
getName()
/setName(“Jane”)
),中间name属性是动态的(使用get(“middleName”)
/set(“middleName”、“Anne”)访问)
。谢谢是的,就是这样,还有关于类名,我将从XML文件中提取它们,基本上我所有的实体都在一个文件中,然后定义,然后我将读取它并创建POJO对象,并将其作为映射源在应用程序中使用。MOXy提供了一个XML映射文件(),可用于映射静态类、将动态属性添加到静态类()或boostrap完全动态的模型().这就是你要找的吗?最后一个似乎是我一直在找的东西。主要的问题是,从XML文件中读取结构,然后使用该结构来处理从第三方获取的数据,基本上我不确定这些是否会像我想的那样帮助我……但调查:)
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="blog.metadatasource.refresh">
<java-types>
<java-type name="Customer">
<java-attributes>
<xml-element
java-attribute="middleName"
name="middle-name"
type="java.lang.String"/>
<xml-element
java-attribute="shippingAddress"
name="shipping-address"
type="blog.metadatasource.multiple.Address"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
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);