gpt4 book ai didi

Java 将 XML 解码为动态对象

转载 作者:搜寻专家 更新时间:2023-11-01 02:31:58 25 4
gpt4 key购买 nike

我正在寻找从 XML 定义创建和加载 JAVA 对象的最佳工具/方法。我已经 checkout JAXB ,看起来很不错,但没有找到有没有办法处理实体的属性是动态的,或者不时更改的,所以想要有类似自动处理实体的方式,而不需要将 Object 转换为预定义的 Entity 对象.是否存在这样的东西?

工作流程就像这样从 XML 中读取,为每个具有动态属性集的实体创建类和/或为这些实体创建 ORM 映射部分,然后所有操作检索/存储到数据库中,或者可能会使用一些 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<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);
}

}

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

<?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>

了解更多信息


选项 #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);

了解更多信息

关于Java 将 XML 解码为动态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7273615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com