Получить имя класса Java из QName - PullRequest
4 голосов
/ 18 февраля 2011

Предположим, у вас есть QName, представляющий тип в документе .xsd.Как я могу узнать имя класса, в который он будет распакован?

Например, у меня есть QName: {http://www.domain.com/service/things.xsd}customer

Это будет распаковано в com.domain.service.things.Customer.

Есть ли способ, которым я могу сделать это без разбора строкового представления QName?

Редактировать:

У меня есть некоторые определения .xsd, которые используются для созданияКлассы JavaЯ хочу выбрать один из этих классов Java динамически на основе QName, которое передается в виде строки в форме HTML.

Edit2:

Поскольку имена этих классов генерируются автоматическигде-то должен быть метод, который генерирует их имена из QName.

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011

Вы можете использовать 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 голосов
/ 18 февраля 2011
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;
}
...