我有一个 XSD 文件,我还想从中生成 C# 和 Java 类。
我首先根据类所在的 C# 命名空间在 XSD 中设置命名空间。生成(使用 Microsoft 工具)运行良好,序列化也运行良好,我可以根据 XSD 验证它们 - 完美。
现在我想使用 JAXB 创建 java 类。
问题是要创建的类具有与 C# 中不同的包结构。所以当我将XSD命名空间设置为java的包结构时,它工作得很好。我可以序列化并验证 XML。
现在我的问题:
有办法解决这个问题吗? (两个生成工具都有一个 XSD)
我是否不了解命名空间的实际用途?
谢谢
编辑:由于似乎存在误解,我添加了一个示例
XSD: targetNamespace = "http://foo.bar/mySubNs/model"
- C# 模型命名空间:com.foo.mySubNs.model(适合 XSD 命名空间)
所有生成的类都将具有通过 MS codegen 提供的相同命名空间
- Java 模型命名空间:com.foo.myOtherSubNs.model(与 XSD 命名空间不同)
生成的类将具有“C# 命名空间”。结果,这些类将无法编译。
如果我在 java 代码生成期间更改名称空间,我就可以编译这些类。到目前为止,一切都很好。但我无法根据 XSD 验证该 java 类生成的 XML,因为命名空间不同。
为了在 Java 中编组我的对象,我使用 JAXB,如下所示:
ValidationEventCollector validationCollector = new ValidationEventCollector();
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new File ("my/schema/location"));
// JAXB_CONTEXT is just an instance of "JAXBContext"
Marshaller marshaller = JAXB_CONTEXT.createMarshaller();
marshaller.setSchema(schema);
marshaller.setEventHandler(validationCollector);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
JAXBElement<MyClass> root = new JAXBElement<MyClass> ( new QName(MyClass.class.getPackage().getName(),"MyClass"),MyClass.class, node);
marshaller.marshal(root, new File("output/Path/obj.xml"));
为了从模式构建我的 java 类,我在 ant 构建脚本中使用 xjc-task:
<xjc destdir="${dir.src.gen}" removeOldOutput="no" extension="true">
<schema dir="${dir.schema}" includes="${file.schema}"/>
<binding dir="${dir.schema}" includes="*.xjb"/>
<produces dir="${dir.src.gen}" includes="**/*.java"/>
</xjc>