从QName获取Java类名

4
假设您有一个QName,表示.xsd文档中的一种类型。我如何找出它将解组成的类的名称?
例如,我有一个QName:{http://www.domain.com/service/things.xsd}customer,它被解组成com.domain.service.things.Customer
是否有一种方法可以在不解析QName字符串表示形式的情况下完成此操作?
编辑:
我定义了一些.xsd文件,用于创建Java类。我想根据在HTML表单上作为字符串传递的QName动态选择其中一个Java类。
编辑2:
由于这些类的名称是自动生成的,因此必须有一种方法从QName生成它们的名称。

你能提供更多关于你正在尝试做什么的细节吗?如果不知道更多信息,我会建议你只需使用xjc(http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/jaxb/xjc.html)将XML编译为Java并查看代码。但我相信这个问题肯定还有更多内容。 - gbvb
2个回答

4
你可以利用JAXBInstropector并进行以下操作:
package example;

import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBIntrospector;
import javax.xml.namespace.QName;

public class Demo {

    public static void main(String[] args) throws Exception {
        Class[] classes = new Class[3];
        classes[0] = A.class;
        classes[1] = B.class;
        classes[2] = C.class;

        JAXBContext jc = JAXBContext.newInstance(classes);

        JAXBIntrospector ji = jc.createJAXBIntrospector();
        Map<QName, Class> classByQName = new HashMap<QName, Class>(classes.length);
        for(Class clazz : classes) {
            QName qName = ji.getElementName(clazz.newInstance());
            if(null != qName) {
                classByQName.put(qName, clazz);
            }
        }

        QName qName = new QName("http://www.example.com", "EH");
        System.out.println(classByQName.get(qName));
    }

}

以下是模型类: A
package example;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="EH", namespace="http://www.example.com")
public class A {
}

B

package example;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="BEE", namespace="urn:example")
public class B {
}

C

package example;

public class C {
}

输出

class example.A

0
private static String getClassName(final QName qName) {
    final String clazz = WordUtils.capitalize(qName.getLocalPart());
    final String ns = qName.getNamespaceURI();

    String s = ns.replace("http://", "");
    s = s.replace("www.", "");
    s = s.replace(".xsd", "");
    s = s.replace("/", ".");
    final String tld = s.split(".")[1];
    s = s.replace("." + tld, "");

    return tld + "." + s + "." + clazz;
}

您还需要防止算法生成带有无效字符的类名。JAXB规范(JSR-222)中包含完整的算法。 - bdoughan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接