假设您有一个QName表示.xsd文档中的类型。我怎样才能找到它要解组的类的名称?
例如,我有一个QName:{http://www.domain.com/service/things.xsd}customer
将其解组为com.domain.service.things.Customer
。
有没有办法可以在不解析QName字符串表示的情况下执行此操作?
编辑:
我已经定义了一些用于创建Java类的.xsd。我想根据在HTML表单上作为String传入的QName动态选择其中一个Java类。
EDIT2:
由于这些类的名称是自动生成的,因此某处必须有一个从QName生成名称的方法。
答案 0 :(得分: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 {
}
<强>乙强>
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
答案 1 :(得分: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;
}