Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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 GrailsXML到对象绑定_Java_Xml_Grails - Fatal编程技术网

Java GrailsXML到对象绑定

Java GrailsXML到对象绑定,java,xml,grails,Java,Xml,Grails,是否有grails插件或库可以将XML数据映射到Java类对象 我正在寻找一些将xml数据映射到Java类字段的groovy类 ---更新----- 下面的grails服务类尝试进行此映射,但不起作用 有人会给出提示如何更正下面的代码以使其正常工作吗 谢谢 }Groovy的XMLSlurper还不够?它不是通用的。我们需要手动解析xml并保存到Java对象。正当我需要的是一个通用方法来自动绑定一个java类和xml数据。我已经更新了OP。我尝试绑定一个类。但它不起作用。你可以使用Xstream

是否有grails插件或库可以将XML数据映射到Java类对象

我正在寻找一些将xml数据映射到Java类字段的groovy类

---更新-----

下面的grails服务类尝试进行此映射,但不起作用

有人会给出提示如何更正下面的代码以使其正常工作吗

谢谢



}

Groovy的
XMLSlurper
还不够?它不是通用的。我们需要手动解析xml并保存到Java对象。正当我需要的是一个通用方法来自动绑定一个java类和xml数据。我已经更新了OP。我尝试绑定一个类。但它不起作用。你可以使用Xstream来实现。检查这篇文章我写的这篇文章真的很好。正是我想要的。我要试试XStream。谢谢
class DataBinderService {

boolean transactional = false
def grailsApplication
private BeanWrapper wrapper = new BeanWrapperImpl()

public List bindAllXmlData (Class targetClass, GPathResult source, List properties) {
    if (targetClass == null || source == null || properties == null) return null
    def resultList = []
    def  className = WordUtils.uncapitalize(targetClass.simpleName)
    source[className]?.each {
        def boundObj = bindXmlData(targetClass, it, properties)
        System.out.println(boundObj)
        resultList.add(boundObj)
    }
    return resultList
}

public Object bindXmlData (Class targetClass, GPathResult source, List properties) {
    if (targetClass == null || source == null || properties == null) return null
    def targetObject = grailsApplication.classLoader.loadClass(targetClass.name).newInstance()
    if (targetObject) {
        return bindXmlData(targetObject, source, properties)
    } else {
        return null
    }
}

public Object bindXmlData (Object target, GPathResult source, List properties) {
    if (target == null || source == null || properties == null) return null
    wrapper.registerCustomEditor (Date.class, new CustomDateBinder())
    wrapper.setWrappedInstance(target)
    properties.each {String property ->
        if (property.contains('.')) {//This indicates a domain class to bind e.g. experiment.id -> Experiment
            def propertyName = property.tokenize('.')
            def id = source[propertyName[0]]["@${propertyName[1]}"]?.toString()
            if (id != null) {
                def subdomainInstance = null
                try {subdomainInstance = grailsApplication.classLoader.loadClass("edu.kit.iism.experimentcenter.${WordUtils.capitalize(propertyName[0])}").get(id)} catch (Exception ex) {}
                if (subdomainInstance != null) wrapper.setPropertyValue(propertyName[0], subdomainInstance)
            }
        } else if (property.equals('id')) { //The id property is set as an attribute rather than text
            def id = source['@id']?.toString()
            if (id != null) wrapper.setPropertyValue(property, id)
        } else { //regular attributes
            def prop = source[property]?.toString()
            if (prop != null) wrapper.setPropertyValue(property, prop)
        }
    }
    return target
}