是否有可以从 java 类生成 xsd 模式的库?谷歌产生了很多相反的结果(来自 xsd 的 java 类)。
问问题
15173 次
4 回答
7
JAXB 2.0 允许您从带注释的 Java 类创建 XML 模式。
您可以在AMIS 博客和JavaPassion 站点上找到一些示例。
于 2009-08-24T22:35:26.427 回答
4
这是我的做法:
public static void pojoToXSD(Class<?> pojo, OutputStream out) throws IOException, TransformerException, JAXBException {
JAXBContext context = JAXBContext.newInstance(pojo);
final List<DOMResult> results = new ArrayList<>();
context.generateSchema(new SchemaOutputResolver() {
@Override
public Result createOutput(String ns, String file)
throws IOException {
DOMResult result = new DOMResult();
result.setSystemId(file);
results.add(result);
return result;
}
});
DOMResult domResult = results.get(0);
// Use a Transformer for output
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DOMSource source = new DOMSource(domResult.getNode());
StreamResult result = new StreamResult(out);
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(source, result);
}
如何使用上面的方法
try {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
pojoToXSD(NESingleResponse.class, stream);
String finalString = new String(stream.toByteArray());
System.out.println(finalString);
} catch (JAXBException ex) {
Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
}
于 2011-01-31T18:33:29.470 回答
3
JiBX这样做
模式生成器工具首先读取一个或多个 JiBX 绑定定义,然后使用反射来解释绑定中引用的 Java 类的结构。通过将绑定定义与实际类信息相结合,模式生成器能够构造一个或多个 XML 模式来表示由绑定处理的文档。
于 2009-08-24T22:11:52.277 回答
-1
感谢您提供您的方法。只是想添加完整的示例。
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import test.Test;
public class Main {
public static void main(String[] args) throws JAXBException,
FileNotFoundException {
JAXBContext context = JAXBContext.newInstance("test");
try {
new Main().pojoToXSD(context, new Test(), System.out);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void pojoToXSD(JAXBContext context, Object pojo, OutputStream out)
throws IOException, TransformerException
{
final List<DOMResult> results = new ArrayList<DOMResult>();
context.generateSchema(new SchemaOutputResolver() {
@Override
public Result createOutput(String ns, String file)
throws IOException {
DOMResult result = new DOMResult();
result.setSystemId(file);
results.add(result);
return result;
}
});
DOMResult domResult = results.get(0);
com.sun.org.apache.xerces.internal.dom.DocumentImpl doc = com.sun.org.apache.xerces.internal.dom.DocumentImpl) domResult.getNode();
// Use a Transformer for output
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(out);
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(source, result);
}
}
//---------- below will go in test package
package test;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;
@XmlRegistry
public class ObjectFactory {
private final static QName _Test_QNAME = new Name("urn:vertexinc:enterprise:calendar:1:0", "Test");
public ObjectFactory() {
}
public Test createTest() {
return new Test();
}
}
package test;
public class Test {
String name;
String cls;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCls() {
return cls;
}
public void setCls(String cls) {
this.cls = cls;
}
}
于 2013-05-11T20:44:07.837 回答