Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java将XML解组到动态对象_Java_Architecture_Orm_Mapping_Jaxb - Fatal编程技术网

Java将XML解组到动态对象

Java将XML解组到动态对象,java,architecture,orm,mapping,jaxb,Java,Architecture,Orm,Mapping,Jaxb,我正在寻找从XML定义创建和加载JAVA对象的最佳工具/方法。 我已经签出了,看起来很不错,但没有找到一种方法来处理属性是动态的或不时更改的实体,所以希望有一种类似于自动处理实体的方法,而无需将对象转换为预定义的实体对象。这样的事情存在吗 工作流是这样的:从XML中读取每个实体的创建类,为这些实体创建一组动态属性和/或ORM映射部分,然后将所有操作检索/存储到db中,或者可能会使用一些NoSQL解决方案,如MongoDB。所以,您基本上是在尝试制作POJO(普通的旧Java对象)使用XML文件?

我正在寻找从XML定义创建和加载JAVA对象的最佳工具/方法。 我已经签出了,看起来很不错,但没有找到一种方法来处理属性是动态的或不时更改的实体,所以希望有一种类似于自动处理实体的方法,而无需将对象转换为预定义的实体对象。这样的事情存在吗


工作流是这样的:从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);
    }

}
了解更多信息


是的,我正在尝试创建POJO对象并使用它们,该XML文件包含每个实体的定义、模式外观,并且模式应该不时更改。我需要建立一种管理POJO对象的动态方法。所有数据都将存储在MongoDB中,这个POJO对象将从那里加载它们,所以这个XML只包含POJO对象的定义。验证是不必要的。如果我没弄错的话,你可能会对这两篇文章感兴趣:这就是我如何动态地从xml生成java类。看起来不错,但是如果我们不知道未来POJO对象的确切结构,有没有办法管理事情,在你的示例中,你使用“firstName”、“lastName”、“address”,这是固定的,如果我想让它动态呢?@vaske-使用选项1(具有动态属性的静态模型),name属性是静态的(使用
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);