2011-02-17 79 views
4

假设您有一个QName代表.xsd文档中的类型。我怎样才能找到它将解组的类名称?从QName获取Java类名称

例如,我有一个QName:{http://www.domain.com/service/things.xsd}customer

这被数据编入com.domain.service.things.Customer

有没有一种方法可以在不解析QName字符串表示的情况下做到这一点?

编辑:

我有一些的.xsd的定义被用于创建Java类。我想要根据在HTML表单中作为字符串传入的QName来动态选择这些Java类之一。

EDIT2:

由于这些类的名称被自动生成,某处必须有从一个QName生成他们的名字的方法。

+0

你能提供什么你正在尝试做一个更详细一点?不知道更多,我会说,只需使用xjc(http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/jaxb/xjc.html)将XML编译为java并看代码。但我相信除了这个问题之外,还有更多。 – gbvb 2011-02-17 23:03:19

回答

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)); 
    } 

} 

以下是模型类:

一个

package example; 

import javax.xml.bind.annotation.XmlRootElement; 

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

package example; 

import javax.xml.bind.annotation.XmlRootElement; 

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

Ç

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; 
} 
+0

您还需要警惕您的算法产生具有无效字符的类名称。 JAXB规范(JSR-222)包含完整的算法。 – 2011-02-17 23:57:43